From fcc49cffa031cbfa112c1dc50808dab6f28d6dbb Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 13 Sep 2026 17:27:41 +0200 Subject: [PATCH 01/94] Consolidate CultNet schema contracts into CultLib/contracts/cultnet REC-032 commit 1: move the canonical 33 TS + witness-artifact-bundle schema files (34 total) into runtime-neutral CultLib/contracts/cultnet, move the interop-note schema (and delete the zero-consumer discovery-* schemas per D3, tagged parked/cultnet-discovery-contracts) into contracts/cultnet/interop, and delete the 27 C# and 24 Rust duplicate copies after confirming byte-for-byte equivalence (only cultnet.snapshot-request differs: TS carries shardId/shardEpoch, a known drift already resolved in favor of the TS shape). Rewrite every $id from https://github.com/GameCult/cultnet-ts/contracts/ and .../cultnet-ts/integration/contracts/ to https://github.com/GameCult/CultLib/contracts/cultnet/(interop/); give the two shard-catalog schemas URL ids per D1, replacing the bare cultnet.shard_catalog_*.v0 identifiers; leave ghostlight.agent-state's Ghostlight-owned $id untouched per D5. Repoint every runtime's load path and id literal at the new location: C# csproj EmbeddedResource + LogicalName, Rust include_str! paths, TS contracts.ts imports + swarm-contracts manifest/tooling + package.json files/prepack, and the id/path literals in the C#, Rust, Python and Kotlin interop tests and peers. Python and Kotlin still build their own schema JSON in-process (D2); only their base constants, id literals, and (for Kotlin) contentHash literals were swapped. Every Kotlin contentHash was recomputed from the final canonical files using the runtime's own stable-stringify + SHA-256 function; all matched the planner's precomputed values except cultnet.schema-catalog-response, where the planner's proposed value did not match recomputation and the freshly computed value was used instead. REC-032, decisions D1/D2/D3/D5. Co-Authored-By: Claude Sonnet 5 --- .../cultmesh.session-accepted.schema.json | 2 +- .../cultmesh.session-open.schema.json | 2 +- ...cultmesh.verse-catalog-request.schema.json | 2 +- ...ultmesh.verse-catalog-response.schema.json | 2 +- .../cultnet}/cultnet-distributed-database.md | 0 .../cultnet.database-change-raw.schema.json | 2 +- .../cultnet.database-subscribe.schema.json | 2 +- .../cultnet.database-unsubscribe.schema.json | 2 +- .../cultnet.document-delete.schema.json | 2 +- ...net.document-mutation-contract.schema.json | 2 +- .../cultnet.document-put-raw.schema.json | 2 +- .../cultnet}/cultnet.document-put.schema.json | 2 +- .../cultnet.document-record.schema.json | 2 +- .../cultnet}/cultnet.error.schema.json | 2 +- .../cultnet}/cultnet.hello.schema.json | 2 +- .../cultnet.login-success.schema.json | 2 +- .../cultnet}/cultnet.login.schema.json | 2 +- .../cultnet.operation-request.schema.json | 2 +- .../cultnet.operation-response.schema.json | 2 +- .../cultnet.raw-document-record.schema.json | 2 +- .../cultnet}/cultnet.register.schema.json | 2 +- .../cultnet.sample-change-name.schema.json | 2 +- .../cultnet}/cultnet.sample-chat.schema.json | 2 +- ...cultnet.schema-catalog-request.schema.json | 2 +- ...ultnet.schema-catalog-response.schema.json | 2 +- .../cultnet.schema-descriptor.schema.json | 2 +- .../cultnet.shard-catalog-request.schema.json | 2 +- ...cultnet.shard-catalog-response.schema.json | 2 +- .../cultnet.snapshot-request.schema.json | 2 +- .../cultnet.snapshot-response-raw.schema.json | 2 +- .../cultnet.snapshot-response.schema.json | 2 +- .../cultnet.transport-profile.schema.json | 2 +- .../cultnet}/cultnet.verify.schema.json | 2 +- ...ultnet.witness-artifact-bundle.schema.json | 2 +- .../ghostlight.agent-state.schema.json | 0 .../interop}/cultnet.interop-note.schema.json | 2 +- .../kotlin/org/gamecult/cultmesh/CultMesh.kt | 42 +- packages/cultmesh-py/tests/test_cultmesh.py | 6 +- packages/cultmesh-ts/test/cultmesh.test.ts | 2 +- .../cultnet-py/src/cultnet_py/interop_peer.py | 10 +- .../src/cultnet_py/schema_catalog.py | 2 +- packages/cultnet-py/tests/test_cultnet.py | 6 +- ...net.document-mutation-contract.schema.json | 40 - .../cultnet.document-put-raw.schema.json | 19 - .../cultnet.document-put.schema.json | 19 - .../cultnet.document-record.schema.json | 26 - .../contracts/cultnet.error.schema.json | 15 - .../contracts/cultnet.hello.schema.json | 41 - .../contracts/cultnet.login.schema.json | 19 - .../cultnet.raw-document-record.schema.json | 32 - .../contracts/cultnet.register.schema.json | 21 - .../cultnet.sample-change-name.schema.json | 15 - .../contracts/cultnet.sample-chat.schema.json | 15 - ...ultnet.schema-catalog-response.schema.json | 22 - .../cultnet.schema-descriptor.schema.json | 39 - .../cultnet.shard-catalog-request.schema.json | 19 - .../cultnet.snapshot-request.schema.json | 23 - .../cultnet.snapshot-response.schema.json | 22 - .../contracts/cultnet.verify.schema.json | 17 - .../examples/cultnet_interop_peer.rs | 8 +- packages/cultnet-rs/src/schema_discovery.rs | 44 +- packages/cultnet-rs/tests/cultnet.rs | 4 +- .../cultnet.document-delete.schema.json | 19 - ...net.document-mutation-contract.schema.json | 40 - .../cultnet.document-put.schema.json | 19 - .../cultnet.document-record.schema.json | 26 - .../contracts/cultnet.hello.schema.json | 41 - .../cultnet.login-success.schema.json | 17 - .../cultnet.operation-request.schema.json | 19 - .../cultnet.raw-document-record.schema.json | 32 - .../contracts/cultnet.sample-chat.schema.json | 15 - ...cultnet.schema-catalog-request.schema.json | 31 - ...ultnet.schema-catalog-response.schema.json | 22 - .../cultnet.schema-descriptor.schema.json | 39 - ...cultnet.shard-catalog-response.schema.json | 47 - .../cultnet.snapshot-response-raw.schema.json | 22 - .../cultnet.snapshot-response.schema.json | 22 - .../cultnet.transport-profile.schema.json | 100 --- .../contracts/cultnet.verify.schema.json | 17 - .../ghostlight.agent-state.schema.json | 845 ------------------ .../cultnet.discovery-announce.schema.json | 35 - .../cultnet.discovery-probe.schema.json | 17 - packages/cultnet-ts/package.json | 4 +- packages/cultnet-ts/src/contracts.ts | 66 +- .../generated/swarm-contracts.generated.ts | 2 +- .../test/interop/cultnet-interop-shared.ts | 8 +- .../test/interop/cultnet-interop.test.ts | 6 +- .../tools/generate-swarm-contracts.mjs | 2 +- .../swarm-contracts.manifest.json | 2 +- .../cultnet.database-change-raw.schema.json | 24 - .../cultnet.database-subscribe.schema.json | 19 - .../cultnet.database-unsubscribe.schema.json | 13 - .../cultnet.document-delete.schema.json | 19 - .../cultnet.document-put-raw.schema.json | 19 - .../Contracts/cultnet.error.schema.json | 15 - .../cultnet.login-success.schema.json | 17 - .../Contracts/cultnet.login.schema.json | 19 - .../cultnet.operation-response.schema.json | 20 - .../Contracts/cultnet.register.schema.json | 21 - .../cultnet.sample-change-name.schema.json | 15 - ...cultnet.schema-catalog-request.schema.json | 31 - .../cultnet.snapshot-request.schema.json | 23 - .../cultnet.snapshot-response-raw.schema.json | 22 - .../cultnet.transport-profile.schema.json | 100 --- .../ghostlight.agent-state.schema.json | 845 ------------------ .../GameCult.Networking.csproj | 2 +- .../Program.cs | 8 +- 107 files changed, 145 insertions(+), 3198 deletions(-) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultmesh.session-accepted.schema.json (89%) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultmesh.session-open.schema.json (88%) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultmesh.verse-catalog-request.schema.json (82%) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultmesh.verse-catalog-response.schema.json (96%) rename {src/GameCult.Networking/Contracts => contracts/cultnet}/cultnet-distributed-database.md (100%) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultnet.database-change-raw.schema.json (89%) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultnet.database-subscribe.schema.json (89%) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultnet.database-unsubscribe.schema.json (80%) rename {packages/cultnet-rs/contracts => contracts/cultnet}/cultnet.document-delete.schema.json (83%) rename {src/GameCult.Networking/Contracts => contracts/cultnet}/cultnet.document-mutation-contract.schema.json (90%) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultnet.document-put-raw.schema.json (81%) rename {src/GameCult.Networking/Contracts => contracts/cultnet}/cultnet.document-put.schema.json (82%) rename {src/GameCult.Networking/Contracts => contracts/cultnet}/cultnet.document-record.schema.json (87%) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultnet.error.schema.json (78%) rename {src/GameCult.Networking/Contracts => contracts/cultnet}/cultnet.hello.schema.json (92%) rename {packages/cultnet-rs/contracts => contracts/cultnet}/cultnet.login-success.schema.json (80%) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultnet.login.schema.json (83%) rename {src/GameCult.Networking/Contracts => contracts/cultnet}/cultnet.operation-request.schema.json (88%) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultnet.operation-response.schema.json (89%) rename {src/GameCult.Networking/Contracts => contracts/cultnet}/cultnet.raw-document-record.schema.json (89%) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultnet.register.schema.json (84%) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultnet.sample-change-name.schema.json (77%) rename {src/GameCult.Networking/Contracts => contracts/cultnet}/cultnet.sample-chat.schema.json (77%) rename {packages/cultnet-rs/contracts => contracts/cultnet}/cultnet.schema-catalog-request.schema.json (87%) rename {src/GameCult.Networking/Contracts => contracts/cultnet}/cultnet.schema-catalog-response.schema.json (82%) rename {src/GameCult.Networking/Contracts => contracts/cultnet}/cultnet.schema-descriptor.schema.json (90%) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultnet.shard-catalog-request.schema.json (82%) rename {packages/cultnet-rs/contracts => contracts/cultnet}/cultnet.shard-catalog-response.schema.json (93%) rename {packages/cultnet-ts/contracts => contracts/cultnet}/cultnet.snapshot-request.schema.json (86%) rename {packages/cultnet-rs/contracts => contracts/cultnet}/cultnet.snapshot-response-raw.schema.json (82%) rename {src/GameCult.Networking/Contracts => contracts/cultnet}/cultnet.snapshot-response.schema.json (83%) rename {packages/cultnet-rs/contracts => contracts/cultnet}/cultnet.transport-profile.schema.json (96%) rename {src/GameCult.Networking/Contracts => contracts/cultnet}/cultnet.verify.schema.json (81%) rename {src/GameCult.Networking/Contracts => contracts/cultnet}/cultnet.witness-artifact-bundle.schema.json (96%) rename {packages/cultnet-rs/contracts => contracts/cultnet}/ghostlight.agent-state.schema.json (100%) rename {packages/cultnet-ts/integration/contracts => contracts/cultnet/interop}/cultnet.interop-note.schema.json (86%) delete mode 100644 packages/cultnet-rs/contracts/cultnet.document-mutation-contract.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.document-put-raw.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.document-put.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.document-record.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.error.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.hello.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.login.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.raw-document-record.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.register.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.sample-change-name.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.sample-chat.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.schema-catalog-response.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.schema-descriptor.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.shard-catalog-request.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.snapshot-request.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.snapshot-response.schema.json delete mode 100644 packages/cultnet-rs/contracts/cultnet.verify.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.document-delete.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.document-mutation-contract.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.document-put.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.document-record.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.hello.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.login-success.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.operation-request.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.raw-document-record.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.sample-chat.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.schema-catalog-request.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.schema-catalog-response.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.schema-descriptor.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.shard-catalog-response.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.snapshot-response-raw.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.snapshot-response.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.transport-profile.schema.json delete mode 100644 packages/cultnet-ts/contracts/cultnet.verify.schema.json delete mode 100644 packages/cultnet-ts/contracts/ghostlight.agent-state.schema.json delete mode 100644 packages/cultnet-ts/integration/contracts/cultnet.discovery-announce.schema.json delete mode 100644 packages/cultnet-ts/integration/contracts/cultnet.discovery-probe.schema.json rename packages/cultnet-ts/{contracts => tools}/swarm-contracts.manifest.json (76%) delete mode 100644 src/GameCult.Networking/Contracts/cultnet.database-change-raw.schema.json delete mode 100644 src/GameCult.Networking/Contracts/cultnet.database-subscribe.schema.json delete mode 100644 src/GameCult.Networking/Contracts/cultnet.database-unsubscribe.schema.json delete mode 100644 src/GameCult.Networking/Contracts/cultnet.document-delete.schema.json delete mode 100644 src/GameCult.Networking/Contracts/cultnet.document-put-raw.schema.json delete mode 100644 src/GameCult.Networking/Contracts/cultnet.error.schema.json delete mode 100644 src/GameCult.Networking/Contracts/cultnet.login-success.schema.json delete mode 100644 src/GameCult.Networking/Contracts/cultnet.login.schema.json delete mode 100644 src/GameCult.Networking/Contracts/cultnet.operation-response.schema.json delete mode 100644 src/GameCult.Networking/Contracts/cultnet.register.schema.json delete mode 100644 src/GameCult.Networking/Contracts/cultnet.sample-change-name.schema.json delete mode 100644 src/GameCult.Networking/Contracts/cultnet.schema-catalog-request.schema.json delete mode 100644 src/GameCult.Networking/Contracts/cultnet.snapshot-request.schema.json delete mode 100644 src/GameCult.Networking/Contracts/cultnet.snapshot-response-raw.schema.json delete mode 100644 src/GameCult.Networking/Contracts/cultnet.transport-profile.schema.json delete mode 100644 src/GameCult.Networking/Contracts/ghostlight.agent-state.schema.json diff --git a/packages/cultnet-ts/contracts/cultmesh.session-accepted.schema.json b/contracts/cultnet/cultmesh.session-accepted.schema.json similarity index 89% rename from packages/cultnet-ts/contracts/cultmesh.session-accepted.schema.json rename to contracts/cultnet/cultmesh.session-accepted.schema.json index aca1ff2b..8e5f64e4 100644 --- a/packages/cultnet-ts/contracts/cultmesh.session-accepted.schema.json +++ b/contracts/cultnet/cultmesh.session-accepted.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultmesh.session-accepted.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultmesh.session-accepted.schema.json", "title": "CultMesh Session Accepted", "type": "object", "required": ["schemaVersion", "messageId", "accepted", "verseId", "authorityRuntimeId", "protocolId", "routeGeneration", "clientNonce", "providerKeyId", "providerSignature"], diff --git a/packages/cultnet-ts/contracts/cultmesh.session-open.schema.json b/contracts/cultnet/cultmesh.session-open.schema.json similarity index 88% rename from packages/cultnet-ts/contracts/cultmesh.session-open.schema.json rename to contracts/cultnet/cultmesh.session-open.schema.json index 937f3e28..a24bc1c1 100644 --- a/packages/cultnet-ts/contracts/cultmesh.session-open.schema.json +++ b/contracts/cultnet/cultmesh.session-open.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultmesh.session-open.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultmesh.session-open.schema.json", "title": "CultMesh Session Open", "type": "object", "required": ["schemaVersion", "messageId", "sourceRuntimeId", "verseId", "authorityRuntimeId", "protocolId", "routeGeneration", "clientNonce"], diff --git a/packages/cultnet-ts/contracts/cultmesh.verse-catalog-request.schema.json b/contracts/cultnet/cultmesh.verse-catalog-request.schema.json similarity index 82% rename from packages/cultnet-ts/contracts/cultmesh.verse-catalog-request.schema.json rename to contracts/cultnet/cultmesh.verse-catalog-request.schema.json index e99b9dea..26763d1a 100644 --- a/packages/cultnet-ts/contracts/cultmesh.verse-catalog-request.schema.json +++ b/contracts/cultnet/cultmesh.verse-catalog-request.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultmesh.verse-catalog-request.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultmesh.verse-catalog-request.schema.json", "title": "CultMesh Verse Catalog Request", "type": "object", "required": ["schemaVersion", "messageId"], diff --git a/packages/cultnet-ts/contracts/cultmesh.verse-catalog-response.schema.json b/contracts/cultnet/cultmesh.verse-catalog-response.schema.json similarity index 96% rename from packages/cultnet-ts/contracts/cultmesh.verse-catalog-response.schema.json rename to contracts/cultnet/cultmesh.verse-catalog-response.schema.json index 464908ad..1583051e 100644 --- a/packages/cultnet-ts/contracts/cultmesh.verse-catalog-response.schema.json +++ b/contracts/cultnet/cultmesh.verse-catalog-response.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultmesh.verse-catalog-response.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultmesh.verse-catalog-response.schema.json", "title": "CultMesh Verse Catalog Response", "type": "object", "required": ["schemaVersion", "messageId", "verses"], diff --git a/src/GameCult.Networking/Contracts/cultnet-distributed-database.md b/contracts/cultnet/cultnet-distributed-database.md similarity index 100% rename from src/GameCult.Networking/Contracts/cultnet-distributed-database.md rename to contracts/cultnet/cultnet-distributed-database.md diff --git a/packages/cultnet-ts/contracts/cultnet.database-change-raw.schema.json b/contracts/cultnet/cultnet.database-change-raw.schema.json similarity index 89% rename from packages/cultnet-ts/contracts/cultnet.database-change-raw.schema.json rename to contracts/cultnet/cultnet.database-change-raw.schema.json index dd650fa0..2725a5af 100644 --- a/packages/cultnet-ts/contracts/cultnet.database-change-raw.schema.json +++ b/contracts/cultnet/cultnet.database-change-raw.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.database-change-raw.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.database-change-raw.schema.json", "title": "CultNet Raw Database Change Message", "type": "object", "required": ["schemaVersion", "messageId", "subscriptionId", "changeKind"], diff --git a/packages/cultnet-ts/contracts/cultnet.database-subscribe.schema.json b/contracts/cultnet/cultnet.database-subscribe.schema.json similarity index 89% rename from packages/cultnet-ts/contracts/cultnet.database-subscribe.schema.json rename to contracts/cultnet/cultnet.database-subscribe.schema.json index 08304199..5d9c2b5f 100644 --- a/packages/cultnet-ts/contracts/cultnet.database-subscribe.schema.json +++ b/contracts/cultnet/cultnet.database-subscribe.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.database-subscribe.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.database-subscribe.schema.json", "title": "CultNet Database Subscribe Message", "type": "object", "required": ["schemaVersion", "messageId", "subscriptionId", "includeSnapshot"], diff --git a/packages/cultnet-ts/contracts/cultnet.database-unsubscribe.schema.json b/contracts/cultnet/cultnet.database-unsubscribe.schema.json similarity index 80% rename from packages/cultnet-ts/contracts/cultnet.database-unsubscribe.schema.json rename to contracts/cultnet/cultnet.database-unsubscribe.schema.json index 7d4b0855..a5ea02d1 100644 --- a/packages/cultnet-ts/contracts/cultnet.database-unsubscribe.schema.json +++ b/contracts/cultnet/cultnet.database-unsubscribe.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.database-unsubscribe.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.database-unsubscribe.schema.json", "title": "CultNet Database Unsubscribe Message", "type": "object", "required": ["schemaVersion", "messageId", "subscriptionId"], diff --git a/packages/cultnet-rs/contracts/cultnet.document-delete.schema.json b/contracts/cultnet/cultnet.document-delete.schema.json similarity index 83% rename from packages/cultnet-rs/contracts/cultnet.document-delete.schema.json rename to contracts/cultnet/cultnet.document-delete.schema.json index 265bcaf2..3ba5b3fc 100644 --- a/packages/cultnet-rs/contracts/cultnet.document-delete.schema.json +++ b/contracts/cultnet/cultnet.document-delete.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-delete.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.document-delete.schema.json", "title": "CultNet Document Delete Message", "type": "object", "required": [ diff --git a/src/GameCult.Networking/Contracts/cultnet.document-mutation-contract.schema.json b/contracts/cultnet/cultnet.document-mutation-contract.schema.json similarity index 90% rename from src/GameCult.Networking/Contracts/cultnet.document-mutation-contract.schema.json rename to contracts/cultnet/cultnet.document-mutation-contract.schema.json index e444fef0..4f8c9b78 100644 --- a/src/GameCult.Networking/Contracts/cultnet.document-mutation-contract.schema.json +++ b/contracts/cultnet/cultnet.document-mutation-contract.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-mutation-contract.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.document-mutation-contract.schema.json", "title": "CultNet Document Mutation Contract", "type": "object", "required": [ diff --git a/packages/cultnet-ts/contracts/cultnet.document-put-raw.schema.json b/contracts/cultnet/cultnet.document-put-raw.schema.json similarity index 81% rename from packages/cultnet-ts/contracts/cultnet.document-put-raw.schema.json rename to contracts/cultnet/cultnet.document-put-raw.schema.json index 3c178d03..c2c98030 100644 --- a/packages/cultnet-ts/contracts/cultnet.document-put-raw.schema.json +++ b/contracts/cultnet/cultnet.document-put-raw.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-put-raw.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.document-put-raw.schema.json", "title": "CultNet Raw Document Put Message", "type": "object", "required": [ diff --git a/src/GameCult.Networking/Contracts/cultnet.document-put.schema.json b/contracts/cultnet/cultnet.document-put.schema.json similarity index 82% rename from src/GameCult.Networking/Contracts/cultnet.document-put.schema.json rename to contracts/cultnet/cultnet.document-put.schema.json index a04f5fca..2b92051a 100644 --- a/src/GameCult.Networking/Contracts/cultnet.document-put.schema.json +++ b/contracts/cultnet/cultnet.document-put.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-put.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.document-put.schema.json", "title": "CultNet Document Put Message", "type": "object", "required": [ diff --git a/src/GameCult.Networking/Contracts/cultnet.document-record.schema.json b/contracts/cultnet/cultnet.document-record.schema.json similarity index 87% rename from src/GameCult.Networking/Contracts/cultnet.document-record.schema.json rename to contracts/cultnet/cultnet.document-record.schema.json index 94301dc5..5512c789 100644 --- a/src/GameCult.Networking/Contracts/cultnet.document-record.schema.json +++ b/contracts/cultnet/cultnet.document-record.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-record.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.document-record.schema.json", "title": "CultNet Document Record", "type": "object", "required": [ diff --git a/packages/cultnet-ts/contracts/cultnet.error.schema.json b/contracts/cultnet/cultnet.error.schema.json similarity index 78% rename from packages/cultnet-ts/contracts/cultnet.error.schema.json rename to contracts/cultnet/cultnet.error.schema.json index af6da9cf..08dc1e45 100644 --- a/packages/cultnet-ts/contracts/cultnet.error.schema.json +++ b/contracts/cultnet/cultnet.error.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.error.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.error.schema.json", "title": "CultNet Error Message", "type": "object", "required": [ diff --git a/src/GameCult.Networking/Contracts/cultnet.hello.schema.json b/contracts/cultnet/cultnet.hello.schema.json similarity index 92% rename from src/GameCult.Networking/Contracts/cultnet.hello.schema.json rename to contracts/cultnet/cultnet.hello.schema.json index a557dc3f..36f9e8cf 100644 --- a/src/GameCult.Networking/Contracts/cultnet.hello.schema.json +++ b/contracts/cultnet/cultnet.hello.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.hello.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.hello.schema.json", "title": "CultNet Hello Message", "type": "object", "required": [ diff --git a/packages/cultnet-rs/contracts/cultnet.login-success.schema.json b/contracts/cultnet/cultnet.login-success.schema.json similarity index 80% rename from packages/cultnet-rs/contracts/cultnet.login-success.schema.json rename to contracts/cultnet/cultnet.login-success.schema.json index 3d8a4591..fbe41690 100644 --- a/packages/cultnet-rs/contracts/cultnet.login-success.schema.json +++ b/contracts/cultnet/cultnet.login-success.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.login-success.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.login-success.schema.json", "title": "CultNet Login Success Message", "type": "object", "required": [ diff --git a/packages/cultnet-ts/contracts/cultnet.login.schema.json b/contracts/cultnet/cultnet.login.schema.json similarity index 83% rename from packages/cultnet-ts/contracts/cultnet.login.schema.json rename to contracts/cultnet/cultnet.login.schema.json index 62f49599..86154717 100644 --- a/packages/cultnet-ts/contracts/cultnet.login.schema.json +++ b/contracts/cultnet/cultnet.login.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.login.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.login.schema.json", "title": "CultNet Login Message", "type": "object", "required": [ diff --git a/src/GameCult.Networking/Contracts/cultnet.operation-request.schema.json b/contracts/cultnet/cultnet.operation-request.schema.json similarity index 88% rename from src/GameCult.Networking/Contracts/cultnet.operation-request.schema.json rename to contracts/cultnet/cultnet.operation-request.schema.json index 07cd9d8d..6008e339 100644 --- a/src/GameCult.Networking/Contracts/cultnet.operation-request.schema.json +++ b/contracts/cultnet/cultnet.operation-request.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.operation-request.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.operation-request.schema.json", "title": "CultNet Operation Request", "type": "object", "required": ["schemaVersion", "messageId", "serviceId", "operation", "payloadSchema", "payload"], diff --git a/packages/cultnet-ts/contracts/cultnet.operation-response.schema.json b/contracts/cultnet/cultnet.operation-response.schema.json similarity index 89% rename from packages/cultnet-ts/contracts/cultnet.operation-response.schema.json rename to contracts/cultnet/cultnet.operation-response.schema.json index c3be917d..21f2675c 100644 --- a/packages/cultnet-ts/contracts/cultnet.operation-response.schema.json +++ b/contracts/cultnet/cultnet.operation-response.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.operation-response.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.operation-response.schema.json", "title": "CultNet Operation Response", "type": "object", "required": ["schemaVersion", "messageId", "serviceId", "operation", "status", "payloadSchema", "payload"], diff --git a/src/GameCult.Networking/Contracts/cultnet.raw-document-record.schema.json b/contracts/cultnet/cultnet.raw-document-record.schema.json similarity index 89% rename from src/GameCult.Networking/Contracts/cultnet.raw-document-record.schema.json rename to contracts/cultnet/cultnet.raw-document-record.schema.json index 3348a5fa..2892a717 100644 --- a/src/GameCult.Networking/Contracts/cultnet.raw-document-record.schema.json +++ b/contracts/cultnet/cultnet.raw-document-record.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.raw-document-record.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.raw-document-record.schema.json", "title": "CultNet Raw Document Record", "type": "object", "required": [ diff --git a/packages/cultnet-ts/contracts/cultnet.register.schema.json b/contracts/cultnet/cultnet.register.schema.json similarity index 84% rename from packages/cultnet-ts/contracts/cultnet.register.schema.json rename to contracts/cultnet/cultnet.register.schema.json index 77286f3e..c5f5ce42 100644 --- a/packages/cultnet-ts/contracts/cultnet.register.schema.json +++ b/contracts/cultnet/cultnet.register.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.register.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.register.schema.json", "title": "CultNet Register Message", "type": "object", "required": [ diff --git a/packages/cultnet-ts/contracts/cultnet.sample-change-name.schema.json b/contracts/cultnet/cultnet.sample-change-name.schema.json similarity index 77% rename from packages/cultnet-ts/contracts/cultnet.sample-change-name.schema.json rename to contracts/cultnet/cultnet.sample-change-name.schema.json index fc3fe057..2408a449 100644 --- a/packages/cultnet-ts/contracts/cultnet.sample-change-name.schema.json +++ b/contracts/cultnet/cultnet.sample-change-name.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.sample-change-name.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.sample-change-name.schema.json", "title": "CultNet Sample Change Name Message", "type": "object", "required": [ diff --git a/src/GameCult.Networking/Contracts/cultnet.sample-chat.schema.json b/contracts/cultnet/cultnet.sample-chat.schema.json similarity index 77% rename from src/GameCult.Networking/Contracts/cultnet.sample-chat.schema.json rename to contracts/cultnet/cultnet.sample-chat.schema.json index 8426fb57..e9bf544c 100644 --- a/src/GameCult.Networking/Contracts/cultnet.sample-chat.schema.json +++ b/contracts/cultnet/cultnet.sample-chat.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.sample-chat.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.sample-chat.schema.json", "title": "CultNet Sample Chat Message", "type": "object", "required": [ diff --git a/packages/cultnet-rs/contracts/cultnet.schema-catalog-request.schema.json b/contracts/cultnet/cultnet.schema-catalog-request.schema.json similarity index 87% rename from packages/cultnet-rs/contracts/cultnet.schema-catalog-request.schema.json rename to contracts/cultnet/cultnet.schema-catalog-request.schema.json index 611733d2..5459129b 100644 --- a/packages/cultnet-rs/contracts/cultnet.schema-catalog-request.schema.json +++ b/contracts/cultnet/cultnet.schema-catalog-request.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.schema-catalog-request.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.schema-catalog-request.schema.json", "title": "CultNet Schema Catalog Request Message", "type": "object", "required": [ diff --git a/src/GameCult.Networking/Contracts/cultnet.schema-catalog-response.schema.json b/contracts/cultnet/cultnet.schema-catalog-response.schema.json similarity index 82% rename from src/GameCult.Networking/Contracts/cultnet.schema-catalog-response.schema.json rename to contracts/cultnet/cultnet.schema-catalog-response.schema.json index fa371e48..dbda847e 100644 --- a/src/GameCult.Networking/Contracts/cultnet.schema-catalog-response.schema.json +++ b/contracts/cultnet/cultnet.schema-catalog-response.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.schema-catalog-response.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.schema-catalog-response.schema.json", "title": "CultNet Schema Catalog Response Message", "type": "object", "required": [ diff --git a/src/GameCult.Networking/Contracts/cultnet.schema-descriptor.schema.json b/contracts/cultnet/cultnet.schema-descriptor.schema.json similarity index 90% rename from src/GameCult.Networking/Contracts/cultnet.schema-descriptor.schema.json rename to contracts/cultnet/cultnet.schema-descriptor.schema.json index 23796857..77b6648c 100644 --- a/src/GameCult.Networking/Contracts/cultnet.schema-descriptor.schema.json +++ b/contracts/cultnet/cultnet.schema-descriptor.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.schema-descriptor.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.schema-descriptor.schema.json", "title": "CultNet Schema Descriptor", "type": "object", "required": [ diff --git a/packages/cultnet-ts/contracts/cultnet.shard-catalog-request.schema.json b/contracts/cultnet/cultnet.shard-catalog-request.schema.json similarity index 82% rename from packages/cultnet-ts/contracts/cultnet.shard-catalog-request.schema.json rename to contracts/cultnet/cultnet.shard-catalog-request.schema.json index c91ee09b..7e443e60 100644 --- a/packages/cultnet-ts/contracts/cultnet.shard-catalog-request.schema.json +++ b/contracts/cultnet/cultnet.shard-catalog-request.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "cultnet.shard_catalog_request.v0", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.shard-catalog-request.schema.json", "type": "object", "required": ["schemaVersion", "messageId"], "additionalProperties": false, diff --git a/packages/cultnet-rs/contracts/cultnet.shard-catalog-response.schema.json b/contracts/cultnet/cultnet.shard-catalog-response.schema.json similarity index 93% rename from packages/cultnet-rs/contracts/cultnet.shard-catalog-response.schema.json rename to contracts/cultnet/cultnet.shard-catalog-response.schema.json index b2661786..f0b846ac 100644 --- a/packages/cultnet-rs/contracts/cultnet.shard-catalog-response.schema.json +++ b/contracts/cultnet/cultnet.shard-catalog-response.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "cultnet.shard_catalog_response.v0", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.shard-catalog-response.schema.json", "type": "object", "required": ["schemaVersion", "messageId", "shards"], "additionalProperties": false, diff --git a/packages/cultnet-ts/contracts/cultnet.snapshot-request.schema.json b/contracts/cultnet/cultnet.snapshot-request.schema.json similarity index 86% rename from packages/cultnet-ts/contracts/cultnet.snapshot-request.schema.json rename to contracts/cultnet/cultnet.snapshot-request.schema.json index 76666e3c..9571669c 100644 --- a/packages/cultnet-ts/contracts/cultnet.snapshot-request.schema.json +++ b/contracts/cultnet/cultnet.snapshot-request.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.snapshot-request.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.snapshot-request.schema.json", "title": "CultNet Snapshot Request Message", "type": "object", "required": [ diff --git a/packages/cultnet-rs/contracts/cultnet.snapshot-response-raw.schema.json b/contracts/cultnet/cultnet.snapshot-response-raw.schema.json similarity index 82% rename from packages/cultnet-rs/contracts/cultnet.snapshot-response-raw.schema.json rename to contracts/cultnet/cultnet.snapshot-response-raw.schema.json index a84bc50d..538f48de 100644 --- a/packages/cultnet-rs/contracts/cultnet.snapshot-response-raw.schema.json +++ b/contracts/cultnet/cultnet.snapshot-response-raw.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.snapshot-response-raw.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.snapshot-response-raw.schema.json", "title": "CultNet Raw Snapshot Response Message", "type": "object", "required": [ diff --git a/src/GameCult.Networking/Contracts/cultnet.snapshot-response.schema.json b/contracts/cultnet/cultnet.snapshot-response.schema.json similarity index 83% rename from src/GameCult.Networking/Contracts/cultnet.snapshot-response.schema.json rename to contracts/cultnet/cultnet.snapshot-response.schema.json index 940822ce..87daf147 100644 --- a/src/GameCult.Networking/Contracts/cultnet.snapshot-response.schema.json +++ b/contracts/cultnet/cultnet.snapshot-response.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.snapshot-response.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.snapshot-response.schema.json", "title": "CultNet Snapshot Response Message", "type": "object", "required": [ diff --git a/packages/cultnet-rs/contracts/cultnet.transport-profile.schema.json b/contracts/cultnet/cultnet.transport-profile.schema.json similarity index 96% rename from packages/cultnet-rs/contracts/cultnet.transport-profile.schema.json rename to contracts/cultnet/cultnet.transport-profile.schema.json index 90261c79..dff458f1 100644 --- a/packages/cultnet-rs/contracts/cultnet.transport-profile.schema.json +++ b/contracts/cultnet/cultnet.transport-profile.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.transport-profile.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.transport-profile.schema.json", "title": "CultNet Transport Profile", "type": "object", "required": [ diff --git a/src/GameCult.Networking/Contracts/cultnet.verify.schema.json b/contracts/cultnet/cultnet.verify.schema.json similarity index 81% rename from src/GameCult.Networking/Contracts/cultnet.verify.schema.json rename to contracts/cultnet/cultnet.verify.schema.json index 1f992aa8..301ae338 100644 --- a/src/GameCult.Networking/Contracts/cultnet.verify.schema.json +++ b/contracts/cultnet/cultnet.verify.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.verify.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.verify.schema.json", "title": "CultNet Verify Message", "type": "object", "required": [ diff --git a/src/GameCult.Networking/Contracts/cultnet.witness-artifact-bundle.schema.json b/contracts/cultnet/cultnet.witness-artifact-bundle.schema.json similarity index 96% rename from src/GameCult.Networking/Contracts/cultnet.witness-artifact-bundle.schema.json rename to contracts/cultnet/cultnet.witness-artifact-bundle.schema.json index a9cfbcef..6dd6971d 100644 --- a/src/GameCult.Networking/Contracts/cultnet.witness-artifact-bundle.schema.json +++ b/contracts/cultnet/cultnet.witness-artifact-bundle.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.witness-artifact-bundle.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.witness-artifact-bundle.schema.json", "title": "CultNet Witness Artifact Bundle", "type": "object", "required": [ diff --git a/packages/cultnet-rs/contracts/ghostlight.agent-state.schema.json b/contracts/cultnet/ghostlight.agent-state.schema.json similarity index 100% rename from packages/cultnet-rs/contracts/ghostlight.agent-state.schema.json rename to contracts/cultnet/ghostlight.agent-state.schema.json diff --git a/packages/cultnet-ts/integration/contracts/cultnet.interop-note.schema.json b/contracts/cultnet/interop/cultnet.interop-note.schema.json similarity index 86% rename from packages/cultnet-ts/integration/contracts/cultnet.interop-note.schema.json rename to contracts/cultnet/interop/cultnet.interop-note.schema.json index 8f5d7058..631eec72 100644 --- a/packages/cultnet-ts/integration/contracts/cultnet.interop-note.schema.json +++ b/contracts/cultnet/interop/cultnet.interop-note.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-note.schema.json", + "$id": "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-note.schema.json", "title": "CultNet Interop Note", "type": "object", "required": [ diff --git a/packages/cultmesh-kotlin/src/main/kotlin/org/gamecult/cultmesh/CultMesh.kt b/packages/cultmesh-kotlin/src/main/kotlin/org/gamecult/cultmesh/CultMesh.kt index 104bd1b9..2117c2d8 100644 --- a/packages/cultmesh-kotlin/src/main/kotlin/org/gamecult/cultmesh/CultMesh.kt +++ b/packages/cultmesh-kotlin/src/main/kotlin/org/gamecult/cultmesh/CultMesh.kt @@ -1359,7 +1359,7 @@ fun defineCultNetSchemaDescriptor( schemaJson = schemaJson, ) -private const val cultNetSchemaBase = "https://github.com/GameCult/cultnet-ts/contracts" +private const val cultNetSchemaBase = "https://github.com/GameCult/CultLib/contracts/cultnet" private data class CultNetBuiltInSchemaSpec( val schemaVersion: String, @@ -1377,58 +1377,58 @@ private val cultNetBuiltInSchemaSpecs = listOf( title = "CultNet Hello Message", schemaId = "$cultNetSchemaBase/cultnet.hello.schema.json", requiredFields = listOf("schemaVersion", "runtimeId", "runtimeKind"), - contentHash = "1d2114bf0c92a2dd5e07dd735778ceeb939402c6424550d6d281d9db423f56b3", + contentHash = "f660ef803f293e2882650b3981c6eed835bd8e595c9b880d6c6271e0dcbd79e4", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.document_delete.v0", title = "CultNet Document Delete Message", schemaId = "$cultNetSchemaBase/cultnet.document-delete.schema.json", requiredFields = listOf("schemaVersion", "messageId", "schemaId", "recordKey"), - contentHash = "037f7cf1b30756904e0bfada6bcff486269378997afbe3c4b6fc5c573fc8a4df", + contentHash = "ed7dc202e4f1ebe0d88c5d60c81c53005b44a2557698d3d3c5d2126c01b40f08", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.document_put_raw.v0", title = "CultNet Raw Document Put Message", schemaId = "$cultNetSchemaBase/cultnet.document-put-raw.schema.json", - contentHash = "b61e7e6cce8508653fbeccc4d956ef211c853a174d67c7e1903ce294e15985a2", + contentHash = "34b61b14b49cfc887728673f08aa0f33df7ccd401e79c77d3bc324c72e547177", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.snapshot_request.v0", title = "CultNet Snapshot Request Message", schemaId = "$cultNetSchemaBase/cultnet.snapshot-request.schema.json", - contentHash = "9f6546f51a1aab85978554e6908d7a59e96b3329feff7b35022be210495dd721", + contentHash = "05267d9b5eb450d4aa8979179f74ba3aec2f3a82fead7ba4a16ab5462c7750fa", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.snapshot_response_raw.v0", title = "CultNet Raw Snapshot Response Message", schemaId = "$cultNetSchemaBase/cultnet.snapshot-response-raw.schema.json", - contentHash = "0dbca3338a3ae5d4011aed2c973c75b9b47b6b9dfc0874459ac56da01fef4582", + contentHash = "fdefbdf5d6b0844dd0eabe2c7430d054295d78e41289f96b227dc39f4aab78b9", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.schema_catalog_request.v0", title = "CultNet Schema Catalog Request Message", schemaId = "$cultNetSchemaBase/cultnet.schema-catalog-request.schema.json", wireContracts = listOf("cultnet.schema.v0", "gamecult.networking.v0"), - contentHash = "bdd49b44428daf24b514c521e53027ec944aecfebb39ca0d10967661c303e096", + contentHash = "ed6d63e29de2d492bb831f030b26ff49ba6883cd2be791ec4936c385f765c76a", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.schema_catalog_response.v0", title = "CultNet Schema Catalog Response Message", schemaId = "$cultNetSchemaBase/cultnet.schema-catalog-response.schema.json", wireContracts = listOf("cultnet.schema.v0", "gamecult.networking.v0"), - contentHash = "b158de53d1ca614eacf2e05767122fb4b9e06504c037ad76c649cffdf71dd648", + contentHash = "10b4835d33181fe4b93a33e39b63886c5514899e93682de786e298f7e4a213e9", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.shard_catalog_request.v0", title = "CultNet Shard Catalog Request Message", - schemaId = "cultnet.shard_catalog_request.v0", - contentHash = "0abd131a1db12f6731010333b86e104d550160bd58f539b18413a2b61198fa38", + schemaId = "$cultNetSchemaBase/cultnet.shard-catalog-request.schema.json", + contentHash = "b4edecd8a24f68ebccf0aca9b429d234618ff7e8858a10123d0b328aeae7eb3f", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.shard_catalog_response.v0", title = "CultNet Shard Catalog Response Message", - schemaId = "cultnet.shard_catalog_response.v0", - contentHash = "93a0e90ac81bc6ab21b68925ad25e381edfac8773232333679d3275141cff37b", + schemaId = "$cultNetSchemaBase/cultnet.shard-catalog-response.schema.json", + contentHash = "d86a94c57d7820483912b8b5cef6214ac951d34cb2641d2d21dcb1f1bc0263c0", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.shard_log_request.v0", @@ -1468,7 +1468,7 @@ private val cultNetBuiltInSchemaSpecs = listOf( schemaId = "$cultNetSchemaBase/cultnet.transport-profile.schema.json", kind = "shared_contract", requiredFields = listOf("schemaVersion", "runtimeId", "transports"), - contentHash = "84473264f543ca3443267999e43d72b7993b61b7b2ac53c642c9cbe8b6de0217", + contentHash = "63dfd484e1fd332c167caadf52cb5b4fe12d5ffea4415206c3ef111c196507aa", ), ) @@ -3717,16 +3717,16 @@ private fun cultNetReconnectControllerSchedulesAttemptsAndReset() { private const val interopDocumentType = "cultnet.interop-note" private const val interopSchemaVersion = "cultnet.interop_note.v0" private const val interopMutationIntentType = "cultnet.interop-note-mutation-intent" -private const val interopMutationIntentSchemaId = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-note-mutation-intent.schema.json" +private const val interopMutationIntentSchemaId = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-note-mutation-intent.schema.json" private const val interopMutationIntentSchemaVersion = "cultnet.interop_note_mutation_intent.v0" private const val interopMutationReceiptType = "cultnet.interop-note-mutation-receipt" -private const val interopMutationReceiptSchemaId = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-note-mutation-receipt.schema.json" +private const val interopMutationReceiptSchemaId = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-note-mutation-receipt.schema.json" private const val interopMutationReceiptSchemaVersion = "cultnet.interop_note_mutation_receipt.v0" private const val interopFireCommandType = "cultnet.interop-fire-weapon-command" -private const val interopFireCommandSchemaId = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-fire-weapon-command.schema.json" +private const val interopFireCommandSchemaId = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-fire-weapon-command.schema.json" private const val interopFireCommandSchemaVersion = "cultnet.interop_fire_weapon_command.v0" private const val interopFireReceiptType = "cultnet.interop-fire-weapon-receipt" -private const val interopFireReceiptSchemaId = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-fire-weapon-receipt.schema.json" +private const val interopFireReceiptSchemaId = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-fire-weapon-receipt.schema.json" private const val interopFireReceiptSchemaVersion = "cultnet.interop_fire_weapon_receipt.v0" private const val rudpInteropConnectionId = 0x43554c54L private const val rudpInteropMaxFragmentBytes = 1024 @@ -4627,11 +4627,11 @@ private fun cultNetBuiltInSchemaCatalogAdvertisesWireContracts() { check(schemaCatalogRequest["wireContracts"] == listOf("cultnet.schema.v0", "gamecult.networking.v0")) check(!schemaCatalogRequest.containsKey("schemaJson")) val shardCatalogRequest = schemas.single { it["schemaVersion"] == "cultnet.shard_catalog_request.v0" } - check(shardCatalogRequest["schemaId"] == "cultnet.shard_catalog_request.v0") + check(shardCatalogRequest["schemaId"] == "$cultNetSchemaBase/cultnet.shard-catalog-request.schema.json") check(shardCatalogRequest["wireContracts"] == listOf("cultnet.schema.v0")) - check(shardCatalogRequest["contentHash"] == "0abd131a1db12f6731010333b86e104d550160bd58f539b18413a2b61198fa38") + check(shardCatalogRequest["contentHash"] == "b4edecd8a24f68ebccf0aca9b429d234618ff7e8858a10123d0b328aeae7eb3f") val shardCatalogResponse = schemas.single { it["schemaVersion"] == "cultnet.shard_catalog_response.v0" } - check(shardCatalogResponse["schemaId"] == "cultnet.shard_catalog_response.v0") + check(shardCatalogResponse["schemaId"] == "$cultNetSchemaBase/cultnet.shard-catalog-response.schema.json") check(shardCatalogResponse["wireContracts"] == listOf("cultnet.schema.v0")) val inlineCatalog = cultNetBuiltInSchemaCatalog(includeSchemaJson = true) @@ -4644,7 +4644,7 @@ private fun cultNetBuiltInSchemaCatalogAdvertisesWireContracts() { ) val transportProfile = mapList(transportResponse.body["schemas"]).single() check(transportProfile["kind"] == "shared_contract") - check(transportProfile["contentHash"] == "84473264f543ca3443267999e43d72b7993b61b7b2ac53c642c9cbe8b6de0217") + check(transportProfile["contentHash"] == "63dfd484e1fd332c167caadf52cb5b4fe12d5ffea4415206c3ef111c196507aa") check(!transportProfile.containsKey("schemaJson")) val filteredTransportCatalog = CultMesh.createBuiltInSchemaCatalog( diff --git a/packages/cultmesh-py/tests/test_cultmesh.py b/packages/cultmesh-py/tests/test_cultmesh.py index b6a21bb8..8cb2801f 100644 --- a/packages/cultmesh-py/tests/test_cultmesh.py +++ b/packages/cultmesh-py/tests/test_cultmesh.py @@ -1759,11 +1759,11 @@ class CultMeshTests(unittest.TestCase): ) self.assertEqual( builtins.list()[0].schema_id, - "https://github.com/GameCult/cultnet-ts/contracts/cultnet.transport-profile.schema.json", + "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.transport-profile.schema.json", ) self.assertIsNone(builtins.list()[0].schema_json) peer_exchange_schema_id = ( - "https://github.com/GameCult/cultnet-ts/contracts/cultmesh.peer-exchange-request.schema.json" + "https://github.com/GameCult/CultLib/contracts/cultnet/cultmesh.peer-exchange-request.schema.json" ) filtered_builtin = CultMesh.create_builtin_schema_catalog( include_schema_json=True, @@ -4033,7 +4033,7 @@ class CultMeshTests(unittest.TestCase): self.assertIn("cultmesh.peer_exchange_response.v0", wire_descriptors) self.assertIn("cultnet.error.v0", {descriptor.schema_version for descriptor in synced_wire_descriptors}) self.assertIn("cultnet.document_put_raw.v0", {descriptor.schema_version for descriptor in synced_wire_descriptors}) - self.assertIsNotNone(synced_schema_catalog.get("https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-put-raw.schema.json")) + self.assertIsNotNone(synced_schema_catalog.get("https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.document-put-raw.schema.json")) self.assertEqual(snapshot_response["documents"][0]["recordKey"], "note:1") self.assertEqual(typed_snapshot_response.documents[0].record_key, "note:1") self.assertEqual(typed_snapshot_response.documents[0].schema_id, "mesh.server_note.v1") diff --git a/packages/cultmesh-ts/test/cultmesh.test.ts b/packages/cultmesh-ts/test/cultmesh.test.ts index 16d51e1e..77bd635c 100644 --- a/packages/cultmesh-ts/test/cultmesh.test.ts +++ b/packages/cultmesh-ts/test/cultmesh.test.ts @@ -2509,7 +2509,7 @@ test("CultMesh TS branded facade exposes schema and shard catalogs", () => { ); assert.equal( builtIns.get( - "https://github.com/GameCult/cultnet-ts/contracts/cultnet.transport-profile.schema.json", + "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.transport-profile.schema.json", )?.schemaVersion, "cultnet.transport_profile.v0", ); diff --git a/packages/cultnet-py/src/cultnet_py/interop_peer.py b/packages/cultnet-py/src/cultnet_py/interop_peer.py index ca3c692d..2eaaf0ac 100644 --- a/packages/cultnet-py/src/cultnet_py/interop_peer.py +++ b/packages/cultnet-py/src/cultnet_py/interop_peer.py @@ -55,19 +55,19 @@ from .transport import ( INTEROP_DOCUMENT_TYPE = "cultnet.interop-note" INTEROP_SCHEMA_VERSION = "cultnet.interop_note.v0" INTEROP_MUTATION_INTENT_DOCUMENT_TYPE = "cultnet.interop-note-mutation-intent" -INTEROP_MUTATION_INTENT_SCHEMA_ID = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-note-mutation-intent.schema.json" +INTEROP_MUTATION_INTENT_SCHEMA_ID = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-note-mutation-intent.schema.json" INTEROP_MUTATION_INTENT_SCHEMA_VERSION = "cultnet.interop_note_mutation_intent.v0" INTEROP_MUTATION_RECEIPT_DOCUMENT_TYPE = "cultnet.interop-note-mutation-receipt" -INTEROP_MUTATION_RECEIPT_SCHEMA_ID = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-note-mutation-receipt.schema.json" +INTEROP_MUTATION_RECEIPT_SCHEMA_ID = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-note-mutation-receipt.schema.json" INTEROP_MUTATION_RECEIPT_SCHEMA_VERSION = "cultnet.interop_note_mutation_receipt.v0" INTEROP_FIRE_COMMAND_DOCUMENT_TYPE = "cultnet.interop-fire-weapon-command" -INTEROP_FIRE_COMMAND_SCHEMA_ID = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-fire-weapon-command.schema.json" +INTEROP_FIRE_COMMAND_SCHEMA_ID = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-fire-weapon-command.schema.json" INTEROP_FIRE_COMMAND_SCHEMA_VERSION = "cultnet.interop_fire_weapon_command.v0" INTEROP_FIRE_RECEIPT_DOCUMENT_TYPE = "cultnet.interop-fire-weapon-receipt" -INTEROP_FIRE_RECEIPT_SCHEMA_ID = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-fire-weapon-receipt.schema.json" +INTEROP_FIRE_RECEIPT_SCHEMA_ID = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-fire-weapon-receipt.schema.json" INTEROP_FIRE_RECEIPT_SCHEMA_VERSION = "cultnet.interop_fire_weapon_receipt.v0" WITNESS_ARTIFACT_BUNDLE_DOCUMENT_TYPE = "cultnet.witness_artifact_bundle" -WITNESS_ARTIFACT_BUNDLE_SCHEMA_ID = "https://github.com/GameCult/cultnet-ts/contracts/cultnet.witness-artifact-bundle.schema.json" +WITNESS_ARTIFACT_BUNDLE_SCHEMA_ID = "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.witness-artifact-bundle.schema.json" WITNESS_ARTIFACT_BUNDLE_SCHEMA_VERSION = "cultnet.witness_artifact_bundle.v0" SIMULATION_FACT_SCHEMA_ID = simulation_fact_document.catalog_entry().schema_id DISCOVERY_PROBE_SCHEMA_VERSION = "cultnet.discovery_probe.v0" diff --git a/packages/cultnet-py/src/cultnet_py/schema_catalog.py b/packages/cultnet-py/src/cultnet_py/schema_catalog.py index 1471ef4e..6d71b3cd 100644 --- a/packages/cultnet-py/src/cultnet_py/schema_catalog.py +++ b/packages/cultnet-py/src/cultnet_py/schema_catalog.py @@ -6,7 +6,7 @@ from dataclasses import dataclass, field from typing import Any INTEROP_WIRE_CONTRACT = "cultnet.schema.v0" -CULTNET_SCHEMA_BASE = "https://github.com/GameCult/cultnet-ts/contracts" +CULTNET_SCHEMA_BASE = "https://github.com/GameCult/CultLib/contracts/cultnet" VERSE_CATALOG_REQUEST = "cultmesh.verse_catalog_request.v0" PEER_EXCHANGE_REQUEST = "cultmesh.peer_exchange_request.v0" TRANSPORT_PROFILE_SCHEMA_VERSION = "cultnet.transport_profile.v0" diff --git a/packages/cultnet-py/tests/test_cultnet.py b/packages/cultnet-py/tests/test_cultnet.py index 171a34b9..4c57f42b 100644 --- a/packages/cultnet-py/tests/test_cultnet.py +++ b/packages/cultnet-py/tests/test_cultnet.py @@ -1677,7 +1677,7 @@ class CultNetTests(unittest.TestCase): self.assertIn("operations", mutation_contract["properties"]) self.assertEqual( hello_schema["properties"]["transportProfiles"]["items"]["$ref"], - "https://github.com/GameCult/cultnet-ts/contracts/cultnet.transport-profile.schema.json", + "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.transport-profile.schema.json", ) consensus_schema = json.loads(by_version["cultnet.simulation_consensus_candidate.v0"]["schemaJson"]) @@ -1686,7 +1686,7 @@ class CultNetTests(unittest.TestCase): def test_cultnet_schema_catalog_applies_filters_and_responses(self) -> None: catalog = wire_message_schema_catalog(include_schema_json=True) - descriptor = catalog.get("https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-put-raw.schema.json") + descriptor = catalog.get("https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.document-put-raw.schema.json") self.assertIsNotNone(descriptor) assert descriptor is not None self.assertEqual(descriptor.kind, "wire_message") @@ -1902,7 +1902,7 @@ class CultNetTests(unittest.TestCase): runtime_kind="python", display_name="Python Interop Test", agent_id="python-interop-test-agent", - schema_path=str(Path("packages/cultnet-ts/integration/contracts/cultnet.interop-note.schema.json")), + schema_path=str(Path("contracts/cultnet/interop/cultnet.interop-note.schema.json")), ) binding = state.bindings["note"] logged_value = { diff --git a/packages/cultnet-rs/contracts/cultnet.document-mutation-contract.schema.json b/packages/cultnet-rs/contracts/cultnet.document-mutation-contract.schema.json deleted file mode 100644 index e444fef0..00000000 --- a/packages/cultnet-rs/contracts/cultnet.document-mutation-contract.schema.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-mutation-contract.schema.json", - "title": "CultNet Document Mutation Contract", - "type": "object", - "required": [ - "documentType", - "operations", - "authority" - ], - "additionalProperties": false, - "properties": { - "documentType": { "type": "string", "minLength": 1 }, - "payloadSchemaVersion": { "type": "string", "minLength": 1 }, - "operations": { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "enum": ["snapshot", "documentPut", "documentDelete", "intentSubmit", "receiptWatch"] - } - }, - "authority": { - "type": "string", - "enum": ["readOnly", "localUser", "coordinator", "runtime", "denied"] - }, - "intentDocumentTypes": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "receiptDocumentTypes": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "notes": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.document-put-raw.schema.json b/packages/cultnet-rs/contracts/cultnet.document-put-raw.schema.json deleted file mode 100644 index 3c178d03..00000000 --- a/packages/cultnet-rs/contracts/cultnet.document-put-raw.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-put-raw.schema.json", - "title": "CultNet Raw Document Put Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId", - "document" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.document_put_raw.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "document": { - "$ref": "./cultnet.raw-document-record.schema.json" - } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.document-put.schema.json b/packages/cultnet-rs/contracts/cultnet.document-put.schema.json deleted file mode 100644 index a04f5fca..00000000 --- a/packages/cultnet-rs/contracts/cultnet.document-put.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-put.schema.json", - "title": "CultNet Document Put Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId", - "document" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.document_put.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "document": { - "$ref": "./cultnet.document-record.schema.json" - } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.document-record.schema.json b/packages/cultnet-rs/contracts/cultnet.document-record.schema.json deleted file mode 100644 index 94301dc5..00000000 --- a/packages/cultnet-rs/contracts/cultnet.document-record.schema.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-record.schema.json", - "title": "CultNet Document Record", - "type": "object", - "required": [ - "schemaId", - "recordKey", - "storedAt", - "payload" - ], - "additionalProperties": false, - "properties": { - "schemaId": { "type": "string", "minLength": 1 }, - "recordKey": { "type": "string", "minLength": 1 }, - "storedAt": { "type": "string", "minLength": 1 }, - "payload": {}, - "sourceRuntimeId": { "type": "string", "minLength": 1 }, - "sourceAgentId": { "type": "string", "minLength": 1 }, - "sourceRole": { "type": "string", "minLength": 1 }, - "tags": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.error.schema.json b/packages/cultnet-rs/contracts/cultnet.error.schema.json deleted file mode 100644 index af6da9cf..00000000 --- a/packages/cultnet-rs/contracts/cultnet.error.schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.error.schema.json", - "title": "CultNet Error Message", - "type": "object", - "required": [ - "schemaVersion", - "error" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.error.v0" }, - "error": { "type": "string", "minLength": 1 } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.hello.schema.json b/packages/cultnet-rs/contracts/cultnet.hello.schema.json deleted file mode 100644 index a557dc3f..00000000 --- a/packages/cultnet-rs/contracts/cultnet.hello.schema.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.hello.schema.json", - "title": "CultNet Hello Message", - "type": "object", - "required": [ - "schemaVersion", - "runtimeId", - "runtimeKind" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.hello.v0" }, - "runtimeId": { "type": "string", "minLength": 1 }, - "runtimeKind": { "type": "string", "minLength": 1 }, - "agentId": { "type": "string", "minLength": 1 }, - "role": { "type": "string", "minLength": 1 }, - "displayName": { "type": "string", "minLength": 1 }, - "supportedDocumentTypes": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "supportedMutationContracts": { - "type": "array", - "items": { - "$ref": "./cultnet.document-mutation-contract.schema.json" - } - }, - "supportedMessageVersions": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "transportProfiles": { - "type": "array", - "items": { - "$ref": "./cultnet.transport-profile.schema.json" - } - }, - "supportsSchemaCatalog": { "type": "boolean" } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.login.schema.json b/packages/cultnet-rs/contracts/cultnet.login.schema.json deleted file mode 100644 index 62f49599..00000000 --- a/packages/cultnet-rs/contracts/cultnet.login.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.login.schema.json", - "title": "CultNet Login Message", - "type": "object", - "required": [ - "schemaVersion", - "nonce", - "auth", - "password" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.login.v0" }, - "nonce": { "type": "string", "minLength": 1 }, - "auth": { "type": "string", "minLength": 1 }, - "password": { "type": "string", "minLength": 1 } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.raw-document-record.schema.json b/packages/cultnet-rs/contracts/cultnet.raw-document-record.schema.json deleted file mode 100644 index 3348a5fa..00000000 --- a/packages/cultnet-rs/contracts/cultnet.raw-document-record.schema.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.raw-document-record.schema.json", - "title": "CultNet Raw Document Record", - "type": "object", - "required": [ - "schemaId", - "recordKey", - "storedAt", - "payloadEncoding", - "payload" - ], - "additionalProperties": false, - "properties": { - "schemaId": { "type": "string", "minLength": 1 }, - "recordKey": { "type": "string", "minLength": 1 }, - "storedAt": { "type": "string", "minLength": 1 }, - "payloadEncoding": { "const": "messagepack" }, - "payload": { - "type": "string", - "contentEncoding": "base64", - "x-cult-runtime-type": "bytes" - }, - "sourceRuntimeId": { "type": "string", "minLength": 1 }, - "sourceAgentId": { "type": "string", "minLength": 1 }, - "sourceRole": { "type": "string", "minLength": 1 }, - "tags": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.register.schema.json b/packages/cultnet-rs/contracts/cultnet.register.schema.json deleted file mode 100644 index 77286f3e..00000000 --- a/packages/cultnet-rs/contracts/cultnet.register.schema.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.register.schema.json", - "title": "CultNet Register Message", - "type": "object", - "required": [ - "schemaVersion", - "nonce", - "email", - "password", - "name" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.register.v0" }, - "nonce": { "type": "string", "minLength": 1 }, - "email": { "type": "string", "minLength": 1 }, - "password": { "type": "string", "minLength": 1 }, - "name": { "type": "string", "minLength": 1 } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.sample-change-name.schema.json b/packages/cultnet-rs/contracts/cultnet.sample-change-name.schema.json deleted file mode 100644 index fc3fe057..00000000 --- a/packages/cultnet-rs/contracts/cultnet.sample-change-name.schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.sample-change-name.schema.json", - "title": "CultNet Sample Change Name Message", - "type": "object", - "required": [ - "schemaVersion", - "name" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.sample.change_name.v0" }, - "name": { "type": "string", "minLength": 1 } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.sample-chat.schema.json b/packages/cultnet-rs/contracts/cultnet.sample-chat.schema.json deleted file mode 100644 index 8426fb57..00000000 --- a/packages/cultnet-rs/contracts/cultnet.sample-chat.schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.sample-chat.schema.json", - "title": "CultNet Sample Chat Message", - "type": "object", - "required": [ - "schemaVersion", - "text" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.sample.chat.v0" }, - "text": { "type": "string", "minLength": 1 } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.schema-catalog-response.schema.json b/packages/cultnet-rs/contracts/cultnet.schema-catalog-response.schema.json deleted file mode 100644 index fa371e48..00000000 --- a/packages/cultnet-rs/contracts/cultnet.schema-catalog-response.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.schema-catalog-response.schema.json", - "title": "CultNet Schema Catalog Response Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId", - "schemas" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.schema_catalog_response.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "schemas": { - "type": "array", - "items": { - "$ref": "./cultnet.schema-descriptor.schema.json" - } - } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.schema-descriptor.schema.json b/packages/cultnet-rs/contracts/cultnet.schema-descriptor.schema.json deleted file mode 100644 index 23796857..00000000 --- a/packages/cultnet-rs/contracts/cultnet.schema-descriptor.schema.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.schema-descriptor.schema.json", - "title": "CultNet Schema Descriptor", - "type": "object", - "required": [ - "schemaId", - "kind", - "wireContracts", - "contentHash" - ], - "additionalProperties": false, - "properties": { - "schemaId": { "type": "string", "minLength": 1 }, - "kind": { - "type": "string", - "enum": [ - "wire_message", - "document_payload", - "shared_contract" - ] - }, - "schemaVersion": { "type": "string", "minLength": 1 }, - "documentType": { "type": "string", "minLength": 1 }, - "title": { "type": "string", "minLength": 1 }, - "wireContracts": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "cultnet.schema.v0", - "gamecult.networking.v0" - ] - } - }, - "contentHash": { "type": "string", "minLength": 1 }, - "schemaJson": { "type": "string", "minLength": 1 } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.shard-catalog-request.schema.json b/packages/cultnet-rs/contracts/cultnet.shard-catalog-request.schema.json deleted file mode 100644 index c91ee09b..00000000 --- a/packages/cultnet-rs/contracts/cultnet.shard-catalog-request.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "cultnet.shard_catalog_request.v0", - "type": "object", - "required": ["schemaVersion", "messageId"], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.shard_catalog_request.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "schemaIds": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "recordKeys": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.snapshot-request.schema.json b/packages/cultnet-rs/contracts/cultnet.snapshot-request.schema.json deleted file mode 100644 index 712d7059..00000000 --- a/packages/cultnet-rs/contracts/cultnet.snapshot-request.schema.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.snapshot-request.schema.json", - "title": "CultNet Snapshot Request Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.snapshot_request.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "schemaIds": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "recordKeys": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.snapshot-response.schema.json b/packages/cultnet-rs/contracts/cultnet.snapshot-response.schema.json deleted file mode 100644 index 940822ce..00000000 --- a/packages/cultnet-rs/contracts/cultnet.snapshot-response.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.snapshot-response.schema.json", - "title": "CultNet Snapshot Response Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId", - "documents" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.snapshot_response.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "documents": { - "type": "array", - "items": { - "$ref": "./cultnet.document-record.schema.json" - } - } - } -} diff --git a/packages/cultnet-rs/contracts/cultnet.verify.schema.json b/packages/cultnet-rs/contracts/cultnet.verify.schema.json deleted file mode 100644 index 1f992aa8..00000000 --- a/packages/cultnet-rs/contracts/cultnet.verify.schema.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.verify.schema.json", - "title": "CultNet Verify Message", - "type": "object", - "required": [ - "schemaVersion", - "nonce", - "session" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.verify.v0" }, - "nonce": { "type": "string", "minLength": 1 }, - "session": { "type": "string", "minLength": 1 } - } -} diff --git a/packages/cultnet-rs/examples/cultnet_interop_peer.rs b/packages/cultnet-rs/examples/cultnet_interop_peer.rs index 562756b8..ad8d6fb9 100644 --- a/packages/cultnet-rs/examples/cultnet_interop_peer.rs +++ b/packages/cultnet-rs/examples/cultnet_interop_peer.rs @@ -55,16 +55,16 @@ use std::time::Instant; const INTEROP_DOCUMENT_TYPE: &str = "cultnet.interop-note"; const INTEROP_SCHEMA_VERSION: &str = "cultnet.interop_note.v0"; const MUTATION_INTENT_TYPE: &str = "cultnet.interop-note-mutation-intent"; -const MUTATION_INTENT_SCHEMA_ID: &str = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-note-mutation-intent.schema.json"; +const MUTATION_INTENT_SCHEMA_ID: &str = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-note-mutation-intent.schema.json"; const MUTATION_INTENT_SCHEMA_VERSION: &str = "cultnet.interop_note_mutation_intent.v0"; const MUTATION_RECEIPT_TYPE: &str = "cultnet.interop-note-mutation-receipt"; -const MUTATION_RECEIPT_SCHEMA_ID: &str = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-note-mutation-receipt.schema.json"; +const MUTATION_RECEIPT_SCHEMA_ID: &str = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-note-mutation-receipt.schema.json"; const MUTATION_RECEIPT_SCHEMA_VERSION: &str = "cultnet.interop_note_mutation_receipt.v0"; const FIRE_COMMAND_TYPE: &str = "cultnet.interop-fire-weapon-command"; -const FIRE_COMMAND_SCHEMA_ID: &str = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-fire-weapon-command.schema.json"; +const FIRE_COMMAND_SCHEMA_ID: &str = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-fire-weapon-command.schema.json"; const FIRE_COMMAND_SCHEMA_VERSION: &str = "cultnet.interop_fire_weapon_command.v0"; const FIRE_RECEIPT_TYPE: &str = "cultnet.interop-fire-weapon-receipt"; -const FIRE_RECEIPT_SCHEMA_ID: &str = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-fire-weapon-receipt.schema.json"; +const FIRE_RECEIPT_SCHEMA_ID: &str = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-fire-weapon-receipt.schema.json"; const FIRE_RECEIPT_SCHEMA_VERSION: &str = "cultnet.interop_fire_weapon_receipt.v0"; const DISCOVERY_ANNOUNCE_SCHEMA_VERSION: &str = "cultnet.discovery_announce.v0"; const RUDP_INTEROP_CONNECTION_ID: u32 = 0x43554C54; diff --git a/packages/cultnet-rs/src/schema_discovery.rs b/packages/cultnet-rs/src/schema_discovery.rs index 272323ba..a32bc7cb 100644 --- a/packages/cultnet-rs/src/schema_discovery.rs +++ b/packages/cultnet-rs/src/schema_discovery.rs @@ -194,28 +194,28 @@ pub fn builtin_schema_registry() -> Result { for registration in [ schema_registration( - include_str!("../contracts/cultnet.hello.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.hello.schema.json"), CultNetSchemaKind::WireMessage, vec![CultNetWireContract::CultNetSchemaV0], Some("cultnet.hello.v0"), None, )?, schema_registration( - include_str!("../contracts/cultnet.document-mutation-contract.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.document-mutation-contract.schema.json"), CultNetSchemaKind::SharedContract, vec![CultNetWireContract::CultNetSchemaV0], None, None, )?, schema_registration( - include_str!("../contracts/cultnet.transport-profile.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.transport-profile.schema.json"), CultNetSchemaKind::SharedContract, vec![CultNetWireContract::CultNetSchemaV0], Some("cultnet.transport_profile.v0"), None, )?, schema_registration( - include_str!("../contracts/cultnet.login.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.login.schema.json"), CultNetSchemaKind::WireMessage, vec![ CultNetWireContract::CultNetSchemaV0, @@ -225,7 +225,7 @@ pub fn builtin_schema_registry() -> Result { None, )?, schema_registration( - include_str!("../contracts/cultnet.register.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.register.schema.json"), CultNetSchemaKind::WireMessage, vec![ CultNetWireContract::CultNetSchemaV0, @@ -235,7 +235,7 @@ pub fn builtin_schema_registry() -> Result { None, )?, schema_registration( - include_str!("../contracts/cultnet.verify.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.verify.schema.json"), CultNetSchemaKind::WireMessage, vec![ CultNetWireContract::CultNetSchemaV0, @@ -245,7 +245,7 @@ pub fn builtin_schema_registry() -> Result { None, )?, schema_registration( - include_str!("../contracts/cultnet.login-success.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.login-success.schema.json"), CultNetSchemaKind::WireMessage, vec![ CultNetWireContract::CultNetSchemaV0, @@ -255,7 +255,7 @@ pub fn builtin_schema_registry() -> Result { None, )?, schema_registration( - include_str!("../contracts/cultnet.error.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.error.schema.json"), CultNetSchemaKind::WireMessage, vec![ CultNetWireContract::CultNetSchemaV0, @@ -265,7 +265,7 @@ pub fn builtin_schema_registry() -> Result { None, )?, schema_registration( - include_str!("../contracts/cultnet.sample-change-name.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.sample-change-name.schema.json"), CultNetSchemaKind::WireMessage, vec![ CultNetWireContract::CultNetSchemaV0, @@ -275,7 +275,7 @@ pub fn builtin_schema_registry() -> Result { None, )?, schema_registration( - include_str!("../contracts/cultnet.sample-chat.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.sample-chat.schema.json"), CultNetSchemaKind::WireMessage, vec![ CultNetWireContract::CultNetSchemaV0, @@ -285,56 +285,56 @@ pub fn builtin_schema_registry() -> Result { None, )?, schema_registration( - include_str!("../contracts/cultnet.document-put.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.document-put.schema.json"), CultNetSchemaKind::WireMessage, vec![CultNetWireContract::CultNetSchemaV0], Some("cultnet.document_put.v0"), None, )?, schema_registration( - include_str!("../contracts/cultnet.document-delete.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.document-delete.schema.json"), CultNetSchemaKind::WireMessage, vec![CultNetWireContract::CultNetSchemaV0], Some("cultnet.document_delete.v0"), None, )?, schema_registration( - include_str!("../contracts/cultnet.raw-document-record.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.raw-document-record.schema.json"), CultNetSchemaKind::SharedContract, vec![CultNetWireContract::CultNetSchemaV0], None, None, )?, schema_registration( - include_str!("../contracts/cultnet.document-put-raw.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.document-put-raw.schema.json"), CultNetSchemaKind::WireMessage, vec![CultNetWireContract::CultNetSchemaV0], Some("cultnet.document_put_raw.v0"), None, )?, schema_registration( - include_str!("../contracts/cultnet.snapshot-request.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.snapshot-request.schema.json"), CultNetSchemaKind::WireMessage, vec![CultNetWireContract::CultNetSchemaV0], Some("cultnet.snapshot_request.v0"), None, )?, schema_registration( - include_str!("../contracts/cultnet.snapshot-response.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.snapshot-response.schema.json"), CultNetSchemaKind::WireMessage, vec![CultNetWireContract::CultNetSchemaV0], Some("cultnet.snapshot_response.v0"), None, )?, schema_registration( - include_str!("../contracts/cultnet.snapshot-response-raw.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.snapshot-response-raw.schema.json"), CultNetSchemaKind::WireMessage, vec![CultNetWireContract::CultNetSchemaV0], Some("cultnet.snapshot_response_raw.v0"), None, )?, schema_registration( - include_str!("../contracts/cultnet.schema-catalog-request.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.schema-catalog-request.schema.json"), CultNetSchemaKind::WireMessage, vec![ CultNetWireContract::CultNetSchemaV0, @@ -344,7 +344,7 @@ pub fn builtin_schema_registry() -> Result { None, )?, schema_registration( - include_str!("../contracts/cultnet.schema-catalog-response.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.schema-catalog-response.schema.json"), CultNetSchemaKind::WireMessage, vec![ CultNetWireContract::CultNetSchemaV0, @@ -354,21 +354,21 @@ pub fn builtin_schema_registry() -> Result { None, )?, schema_registration( - include_str!("../contracts/cultnet.shard-catalog-request.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.shard-catalog-request.schema.json"), CultNetSchemaKind::WireMessage, vec![CultNetWireContract::CultNetSchemaV0], Some("cultnet.shard_catalog_request.v0"), None, )?, schema_registration( - include_str!("../contracts/cultnet.shard-catalog-response.schema.json"), + include_str!("../../../contracts/cultnet/cultnet.shard-catalog-response.schema.json"), CultNetSchemaKind::WireMessage, vec![CultNetWireContract::CultNetSchemaV0], Some("cultnet.shard_catalog_response.v0"), None, )?, schema_registration( - include_str!("../contracts/ghostlight.agent-state.schema.json"), + include_str!("../../../contracts/cultnet/ghostlight.agent-state.schema.json"), CultNetSchemaKind::DocumentPayload, vec![CultNetWireContract::CultNetSchemaV0], Some("ghostlight.agent_state.v0"), diff --git a/packages/cultnet-rs/tests/cultnet.rs b/packages/cultnet-rs/tests/cultnet.rs index b3adc7f4..678fb71d 100644 --- a/packages/cultnet-rs/tests/cultnet.rs +++ b/packages/cultnet-rs/tests/cultnet.rs @@ -1759,7 +1759,7 @@ fn cultmesh_facade_exposes_schema_registry_and_shard_catalog_owners() -> Result< }); assert!(shared_contracts.iter().any(|schema| { schema.schema_id - == "https://github.com/GameCult/cultnet-ts/contracts/cultnet.transport-profile.schema.json" + == "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.transport-profile.schema.json" && schema.schema_version.as_deref() == Some("cultnet.transport_profile.v0") })); @@ -2285,7 +2285,7 @@ fn builtin_schema_registry_advertises_canonical_ghostlight_schema_without_inline assert_eq!(transport_profile.kind, CultNetSchemaKind::SharedContract); assert_eq!( transport_profile.schema_id, - "https://github.com/GameCult/cultnet-ts/contracts/cultnet.transport-profile.schema.json" + "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.transport-profile.schema.json" ); assert_eq!( transport_profile.wire_contracts, diff --git a/packages/cultnet-ts/contracts/cultnet.document-delete.schema.json b/packages/cultnet-ts/contracts/cultnet.document-delete.schema.json deleted file mode 100644 index 265bcaf2..00000000 --- a/packages/cultnet-ts/contracts/cultnet.document-delete.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-delete.schema.json", - "title": "CultNet Document Delete Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId", - "schemaId", - "recordKey" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.document_delete.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "schemaId": { "type": "string", "minLength": 1 }, - "recordKey": { "type": "string", "minLength": 1 } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.document-mutation-contract.schema.json b/packages/cultnet-ts/contracts/cultnet.document-mutation-contract.schema.json deleted file mode 100644 index e444fef0..00000000 --- a/packages/cultnet-ts/contracts/cultnet.document-mutation-contract.schema.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-mutation-contract.schema.json", - "title": "CultNet Document Mutation Contract", - "type": "object", - "required": [ - "documentType", - "operations", - "authority" - ], - "additionalProperties": false, - "properties": { - "documentType": { "type": "string", "minLength": 1 }, - "payloadSchemaVersion": { "type": "string", "minLength": 1 }, - "operations": { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "enum": ["snapshot", "documentPut", "documentDelete", "intentSubmit", "receiptWatch"] - } - }, - "authority": { - "type": "string", - "enum": ["readOnly", "localUser", "coordinator", "runtime", "denied"] - }, - "intentDocumentTypes": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "receiptDocumentTypes": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "notes": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.document-put.schema.json b/packages/cultnet-ts/contracts/cultnet.document-put.schema.json deleted file mode 100644 index a04f5fca..00000000 --- a/packages/cultnet-ts/contracts/cultnet.document-put.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-put.schema.json", - "title": "CultNet Document Put Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId", - "document" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.document_put.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "document": { - "$ref": "./cultnet.document-record.schema.json" - } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.document-record.schema.json b/packages/cultnet-ts/contracts/cultnet.document-record.schema.json deleted file mode 100644 index 94301dc5..00000000 --- a/packages/cultnet-ts/contracts/cultnet.document-record.schema.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-record.schema.json", - "title": "CultNet Document Record", - "type": "object", - "required": [ - "schemaId", - "recordKey", - "storedAt", - "payload" - ], - "additionalProperties": false, - "properties": { - "schemaId": { "type": "string", "minLength": 1 }, - "recordKey": { "type": "string", "minLength": 1 }, - "storedAt": { "type": "string", "minLength": 1 }, - "payload": {}, - "sourceRuntimeId": { "type": "string", "minLength": 1 }, - "sourceAgentId": { "type": "string", "minLength": 1 }, - "sourceRole": { "type": "string", "minLength": 1 }, - "tags": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.hello.schema.json b/packages/cultnet-ts/contracts/cultnet.hello.schema.json deleted file mode 100644 index a557dc3f..00000000 --- a/packages/cultnet-ts/contracts/cultnet.hello.schema.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.hello.schema.json", - "title": "CultNet Hello Message", - "type": "object", - "required": [ - "schemaVersion", - "runtimeId", - "runtimeKind" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.hello.v0" }, - "runtimeId": { "type": "string", "minLength": 1 }, - "runtimeKind": { "type": "string", "minLength": 1 }, - "agentId": { "type": "string", "minLength": 1 }, - "role": { "type": "string", "minLength": 1 }, - "displayName": { "type": "string", "minLength": 1 }, - "supportedDocumentTypes": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "supportedMutationContracts": { - "type": "array", - "items": { - "$ref": "./cultnet.document-mutation-contract.schema.json" - } - }, - "supportedMessageVersions": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "transportProfiles": { - "type": "array", - "items": { - "$ref": "./cultnet.transport-profile.schema.json" - } - }, - "supportsSchemaCatalog": { "type": "boolean" } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.login-success.schema.json b/packages/cultnet-ts/contracts/cultnet.login-success.schema.json deleted file mode 100644 index 3d8a4591..00000000 --- a/packages/cultnet-ts/contracts/cultnet.login-success.schema.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.login-success.schema.json", - "title": "CultNet Login Success Message", - "type": "object", - "required": [ - "schemaVersion", - "nonce", - "session" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.login_success.v0" }, - "nonce": { "type": "string", "minLength": 1 }, - "session": { "type": "string", "minLength": 1 } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.operation-request.schema.json b/packages/cultnet-ts/contracts/cultnet.operation-request.schema.json deleted file mode 100644 index 07cd9d8d..00000000 --- a/packages/cultnet-ts/contracts/cultnet.operation-request.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.operation-request.schema.json", - "title": "CultNet Operation Request", - "type": "object", - "required": ["schemaVersion", "messageId", "serviceId", "operation", "payloadSchema", "payload"], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.operation_request.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "serviceId": { "type": "string", "minLength": 1 }, - "operation": { "type": "string", "minLength": 1 }, - "payloadSchema": { "type": "string", "minLength": 1 }, - "payloadEncoding": { "const": "messagepack-base64" }, - "payload": { "type": "string", "minLength": 1, "contentEncoding": "base64" }, - "sourceRuntimeId": { "type": "string", "minLength": 1 }, - "targetRuntimeId": { "type": "string", "minLength": 1 } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.raw-document-record.schema.json b/packages/cultnet-ts/contracts/cultnet.raw-document-record.schema.json deleted file mode 100644 index 3348a5fa..00000000 --- a/packages/cultnet-ts/contracts/cultnet.raw-document-record.schema.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.raw-document-record.schema.json", - "title": "CultNet Raw Document Record", - "type": "object", - "required": [ - "schemaId", - "recordKey", - "storedAt", - "payloadEncoding", - "payload" - ], - "additionalProperties": false, - "properties": { - "schemaId": { "type": "string", "minLength": 1 }, - "recordKey": { "type": "string", "minLength": 1 }, - "storedAt": { "type": "string", "minLength": 1 }, - "payloadEncoding": { "const": "messagepack" }, - "payload": { - "type": "string", - "contentEncoding": "base64", - "x-cult-runtime-type": "bytes" - }, - "sourceRuntimeId": { "type": "string", "minLength": 1 }, - "sourceAgentId": { "type": "string", "minLength": 1 }, - "sourceRole": { "type": "string", "minLength": 1 }, - "tags": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.sample-chat.schema.json b/packages/cultnet-ts/contracts/cultnet.sample-chat.schema.json deleted file mode 100644 index 8426fb57..00000000 --- a/packages/cultnet-ts/contracts/cultnet.sample-chat.schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.sample-chat.schema.json", - "title": "CultNet Sample Chat Message", - "type": "object", - "required": [ - "schemaVersion", - "text" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.sample.chat.v0" }, - "text": { "type": "string", "minLength": 1 } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.schema-catalog-request.schema.json b/packages/cultnet-ts/contracts/cultnet.schema-catalog-request.schema.json deleted file mode 100644 index 611733d2..00000000 --- a/packages/cultnet-ts/contracts/cultnet.schema-catalog-request.schema.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.schema-catalog-request.schema.json", - "title": "CultNet Schema Catalog Request Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.schema_catalog_request.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "includeSchemaJson": { "type": "boolean" }, - "schemaIds": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "kinds": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "wire_message", - "document_payload", - "shared_contract" - ] - } - } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.schema-catalog-response.schema.json b/packages/cultnet-ts/contracts/cultnet.schema-catalog-response.schema.json deleted file mode 100644 index fa371e48..00000000 --- a/packages/cultnet-ts/contracts/cultnet.schema-catalog-response.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.schema-catalog-response.schema.json", - "title": "CultNet Schema Catalog Response Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId", - "schemas" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.schema_catalog_response.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "schemas": { - "type": "array", - "items": { - "$ref": "./cultnet.schema-descriptor.schema.json" - } - } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.schema-descriptor.schema.json b/packages/cultnet-ts/contracts/cultnet.schema-descriptor.schema.json deleted file mode 100644 index 23796857..00000000 --- a/packages/cultnet-ts/contracts/cultnet.schema-descriptor.schema.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.schema-descriptor.schema.json", - "title": "CultNet Schema Descriptor", - "type": "object", - "required": [ - "schemaId", - "kind", - "wireContracts", - "contentHash" - ], - "additionalProperties": false, - "properties": { - "schemaId": { "type": "string", "minLength": 1 }, - "kind": { - "type": "string", - "enum": [ - "wire_message", - "document_payload", - "shared_contract" - ] - }, - "schemaVersion": { "type": "string", "minLength": 1 }, - "documentType": { "type": "string", "minLength": 1 }, - "title": { "type": "string", "minLength": 1 }, - "wireContracts": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "cultnet.schema.v0", - "gamecult.networking.v0" - ] - } - }, - "contentHash": { "type": "string", "minLength": 1 }, - "schemaJson": { "type": "string", "minLength": 1 } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.shard-catalog-response.schema.json b/packages/cultnet-ts/contracts/cultnet.shard-catalog-response.schema.json deleted file mode 100644 index b2661786..00000000 --- a/packages/cultnet-ts/contracts/cultnet.shard-catalog-response.schema.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "cultnet.shard_catalog_response.v0", - "type": "object", - "required": ["schemaVersion", "messageId", "shards"], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.shard_catalog_response.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "shards": { - "type": "array", - "items": { "$ref": "#/$defs/shardDescriptor" } - } - }, - "$defs": { - "shardDescriptor": { - "type": "object", - "required": ["shardId", "ownerRuntimeId", "epoch"], - "additionalProperties": false, - "properties": { - "shardId": { "type": "string", "minLength": 1 }, - "ownerRuntimeId": { "type": "string", "minLength": 1 }, - "epoch": { "type": "integer", "minimum": 0 }, - "isPrimary": { "type": "boolean" }, - "schemaIds": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "keyPrefix": { "type": "string", "minLength": 1 }, - "primaryEndpoints": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "replicaEndpoints": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "readReplicaEndpoints": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "region": { "type": "string", "minLength": 1 }, - "authorityLeaseId": { "type": "string", "minLength": 1 } - } - } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.snapshot-response-raw.schema.json b/packages/cultnet-ts/contracts/cultnet.snapshot-response-raw.schema.json deleted file mode 100644 index a84bc50d..00000000 --- a/packages/cultnet-ts/contracts/cultnet.snapshot-response-raw.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.snapshot-response-raw.schema.json", - "title": "CultNet Raw Snapshot Response Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId", - "documents" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.snapshot_response_raw.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "documents": { - "type": "array", - "items": { - "$ref": "./cultnet.raw-document-record.schema.json" - } - } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.snapshot-response.schema.json b/packages/cultnet-ts/contracts/cultnet.snapshot-response.schema.json deleted file mode 100644 index 940822ce..00000000 --- a/packages/cultnet-ts/contracts/cultnet.snapshot-response.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.snapshot-response.schema.json", - "title": "CultNet Snapshot Response Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId", - "documents" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.snapshot_response.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "documents": { - "type": "array", - "items": { - "$ref": "./cultnet.document-record.schema.json" - } - } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.transport-profile.schema.json b/packages/cultnet-ts/contracts/cultnet.transport-profile.schema.json deleted file mode 100644 index 90261c79..00000000 --- a/packages/cultnet-ts/contracts/cultnet.transport-profile.schema.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.transport-profile.schema.json", - "title": "CultNet Transport Profile", - "type": "object", - "required": [ - "schemaVersion", - "runtimeId", - "transports" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.transport_profile.v0" }, - "runtimeId": { "type": "string", "minLength": 1 }, - "transports": { - "type": "array", - "items": { - "type": "object", - "required": [ - "transportId", - "protocol", - "channels" - ], - "additionalProperties": false, - "properties": { - "transportId": { "type": "string", "minLength": 1 }, - "protocol": { - "type": "string", - "enum": [ - "tcp_framed", - "litenetlib", - "websocket", - "rudp" - ] - }, - "host": { "type": "string", "minLength": 1 }, - "port": { "type": "integer", "minimum": 1, "maximum": 65535 }, - "path": { "type": "string", "minLength": 1 }, - "discoveryGroup": { "type": "string", "minLength": 1 }, - "wireContracts": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "reconnectPolicy": { - "type": "object", - "required": [ - "schemaVersion", - "policyId", - "baseDelayMs", - "maxDelayMs", - "maxJitterMs" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.reconnect_policy.v0" }, - "policyId": { "type": "string", "minLength": 1 }, - "baseDelayMs": { "type": "integer", "minimum": 0 }, - "maxDelayMs": { "type": "integer", "minimum": 0 }, - "maxJitterMs": { "type": "integer", "minimum": 0 }, - "maxAttempts": { "type": "integer", "minimum": 1 } - } - }, - "channels": { - "type": "array", - "items": { - "type": "object", - "required": [ - "channelId", - "delivery", - "ordering" - ], - "additionalProperties": false, - "properties": { - "channelId": { "type": "string", "minLength": 1 }, - "delivery": { - "type": "string", - "enum": [ - "reliable", - "unreliable" - ] - }, - "ordering": { - "type": "string", - "enum": [ - "ordered", - "unordered", - "sequenced" - ] - }, - "maxPayloadBytes": { "type": "integer", "minimum": 1 }, - "maxFragmentBytes": { "type": "integer", "minimum": 1 }, - "maxPendingReliablePackets": { "type": "integer", "minimum": 1 } - } - } - } - } - } - } - } -} diff --git a/packages/cultnet-ts/contracts/cultnet.verify.schema.json b/packages/cultnet-ts/contracts/cultnet.verify.schema.json deleted file mode 100644 index 1f992aa8..00000000 --- a/packages/cultnet-ts/contracts/cultnet.verify.schema.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.verify.schema.json", - "title": "CultNet Verify Message", - "type": "object", - "required": [ - "schemaVersion", - "nonce", - "session" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.verify.v0" }, - "nonce": { "type": "string", "minLength": 1 }, - "session": { "type": "string", "minLength": 1 } - } -} diff --git a/packages/cultnet-ts/contracts/ghostlight.agent-state.schema.json b/packages/cultnet-ts/contracts/ghostlight.agent-state.schema.json deleted file mode 100644 index 6437cd01..00000000 --- a/packages/cultnet-ts/contracts/ghostlight.agent-state.schema.json +++ /dev/null @@ -1,845 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/Ghostlight/schemas/agent-state.schema.json", - "title": "Ghostlight Agent State Schema", - "description": "First canonical contract for Ghostlight agent, perception, relationship, event, scene, and dialogue-context state.", - "type": "object", - "required": [ - "schema_version", - "world", - "agents", - "relationships", - "events", - "scenes" - ], - "additionalProperties": false, - "properties": { - "schema_version": { - "const": "ghostlight.agent_state.v0" - }, - "world": { - "$ref": "#/$defs/world_state" - }, - "agents": { - "type": "array", - "items": { - "$ref": "#/$defs/agent" - } - }, - "relationships": { - "type": "array", - "items": { - "$ref": "#/$defs/relationship" - } - }, - "events": { - "type": "array", - "items": { - "$ref": "#/$defs/event" - } - }, - "scenes": { - "type": "array", - "items": { - "$ref": "#/$defs/scene" - } - } - }, - "$defs": { - "world_state": { - "type": "object", - "required": [ - "world_id", - "setting", - "time", - "canon_context" - ], - "additionalProperties": false, - "properties": { - "world_id": { - "type": "string" - }, - "setting": { - "type": "string" - }, - "time": { - "type": "object", - "required": [ - "label" - ], - "additionalProperties": true, - "properties": { - "label": { - "type": "string" - } - } - }, - "canon_context": { - "type": "array", - "items": { - "type": "string" - } - }, - "ambient_pressures": { - "type": "array", - "items": { - "$ref": "#/$defs/pressure" - } - } - } - }, - "agent": { - "type": "object", - "required": [ - "agent_id", - "identity", - "canonical_state", - "goals", - "memories", - "perceived_state_overlays" - ], - "additionalProperties": false, - "properties": { - "agent_id": { - "type": "string" - }, - "identity": { - "$ref": "#/$defs/identity" - }, - "canonical_state": { - "$ref": "#/$defs/canonical_state" - }, - "goals": { - "type": "array", - "items": { - "$ref": "#/$defs/goal" - } - }, - "memories": { - "$ref": "#/$defs/memory_bundle" - }, - "perceived_state_overlays": { - "type": "array", - "items": { - "$ref": "#/$defs/perceived_state_overlay" - } - } - } - }, - "identity": { - "type": "object", - "required": [ - "name", - "roles", - "origin", - "public_description" - ], - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "roles": { - "type": "array", - "items": { - "type": "string" - } - }, - "origin": { - "type": "string" - }, - "public_description": { - "type": "string" - }, - "private_notes": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "canonical_state": { - "type": "object", - "required": [ - "underlying_organization", - "stable_dispositions", - "behavioral_dimensions", - "presentation_strategy", - "voice_style", - "situational_state", - "values" - ], - "additionalProperties": false, - "properties": { - "underlying_organization": { - "$ref": "#/$defs/variable_map" - }, - "stable_dispositions": { - "$ref": "#/$defs/variable_map" - }, - "behavioral_dimensions": { - "$ref": "#/$defs/variable_map" - }, - "presentation_strategy": { - "$ref": "#/$defs/variable_map" - }, - "situational_state": { - "$ref": "#/$defs/variable_map" - }, - "values": { - "type": "array", - "items": { - "$ref": "#/$defs/value_commitment" - } - }, - "voice_style": { - "$ref": "#/$defs/variable_map" - } - } - }, - "variable_map": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/state_variable" - } - }, - "state_variable": { - "type": "object", - "required": [ - "mean", - "plasticity", - "current_activation" - ], - "additionalProperties": false, - "properties": { - "mean": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "plasticity": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "current_activation": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "evidence": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "value_commitment": { - "type": "object", - "required": [ - "value_id", - "label", - "priority", - "unforgivable_if_betrayed" - ], - "additionalProperties": false, - "properties": { - "value_id": { - "type": "string" - }, - "label": { - "type": "string" - }, - "priority": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "unforgivable_if_betrayed": { - "type": "boolean" - } - } - }, - "goal": { - "type": "object", - "required": [ - "goal_id", - "description", - "scope", - "priority", - "emotional_stake", - "status" - ], - "additionalProperties": false, - "properties": { - "goal_id": { - "type": "string" - }, - "description": { - "type": "string" - }, - "scope": { - "enum": [ - "immediate", - "scene", - "case", - "arc", - "life" - ] - }, - "priority": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "emotional_stake": { - "type": "string" - }, - "blockers": { - "type": "array", - "items": { - "type": "string" - } - }, - "status": { - "enum": [ - "active", - "blocked", - "dormant", - "resolved", - "abandoned" - ] - } - } - }, - "memory_bundle": { - "type": "object", - "required": [ - "episodic", - "semantic", - "relationship_summaries" - ], - "additionalProperties": false, - "properties": { - "episodic": { - "type": "array", - "items": { - "$ref": "#/$defs/memory" - } - }, - "semantic": { - "type": "array", - "items": { - "$ref": "#/$defs/memory" - } - }, - "relationship_summaries": { - "type": "array", - "items": { - "$ref": "#/$defs/memory" - } - } - } - }, - "memory": { - "type": "object", - "required": [ - "memory_id", - "summary", - "salience", - "confidence" - ], - "additionalProperties": false, - "properties": { - "memory_id": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "salience": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "confidence": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "linked_event_ids": { - "type": "array", - "items": { - "type": "string" - } - }, - "linked_relationship_id": { - "type": "string" - } - } - }, - "perceived_state_overlay": { - "type": "object", - "required": [ - "observer_agent_id", - "target_agent_id", - "perceived_dimensions", - "beliefs", - "distortions" - ], - "additionalProperties": false, - "properties": { - "observer_agent_id": { - "type": "string" - }, - "target_agent_id": { - "type": "string" - }, - "perceived_dimensions": { - "$ref": "#/$defs/inferred_variable_map" - }, - "beliefs": { - "type": "array", - "items": { - "$ref": "#/$defs/belief" - } - }, - "distortions": { - "type": "array", - "items": { - "enum": [ - "hostile_attribution", - "false_reassurance", - "overread_warmth", - "underread_threat", - "false_mask_detection", - "missed_mask_detection", - "status_injury", - "threat_amplification", - "institutional_suspicion_transfer", - "care_underread", - "mask_overfocus" - ] - } - } - } - }, - "belief": { - "type": "object", - "required": [ - "belief_id", - "claim", - "confidence" - ], - "additionalProperties": false, - "properties": { - "belief_id": { - "type": "string" - }, - "claim": { - "type": "string" - }, - "confidence": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "subject_id": { - "type": "string" - }, - "claim_type": { - "enum": [ - "fact", - "identity_inference", - "motive_inference", - "prediction", - "norm", - "value_read", - "relationship_read" - ] - }, - "evidence_event_ids": { - "type": "array", - "items": { - "type": "string" - } - }, - "visibility": { - "enum": [ - "private", - "shared", - "public", - "rumor" - ] - }, - "emotional_charge": { - "type": "number", - "minimum": 0, - "maximum": 1 - } - } - }, - "relationship": { - "type": "object", - "required": [ - "relationship_id", - "source_id", - "target_id", - "stance", - "summary" - ], - "additionalProperties": false, - "properties": { - "relationship_id": { - "type": "string" - }, - "source_id": { - "type": "string" - }, - "target_id": { - "type": "string" - }, - "stance": { - "$ref": "#/$defs/variable_map" - }, - "summary": { - "type": "string" - }, - "unresolved_incident_ids": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "event": { - "type": "object", - "required": [ - "event_id", - "kind", - "summary", - "participants", - "pressure_tags" - ], - "additionalProperties": false, - "properties": { - "event_id": { - "type": "string" - }, - "kind": { - "enum": [ - "dialogue", - "action", - "memory", - "relationship_shift", - "scene_outcome", - "author_note" - ] - }, - "summary": { - "type": "string" - }, - "participants": { - "type": "array", - "items": { - "type": "string" - } - }, - "pressure_tags": { - "type": "array", - "items": { - "type": "string" - } - }, - "observed_exchange": { - "type": "array", - "items": { - "$ref": "#/$defs/event_exchange_turn" - } - }, - "private_interpretations": { - "type": "array", - "items": { - "$ref": "#/$defs/event_private_interpretation" - } - }, - "event_effects": { - "type": "array", - "items": { - "$ref": "#/$defs/event_effect" - } - } - } - }, - "scene": { - "type": "object", - "required": [ - "scene_id", - "location", - "participants", - "public_stakes", - "hidden_stakes", - "dialogue_context_packs" - ], - "additionalProperties": false, - "properties": { - "scene_id": { - "type": "string" - }, - "location": { - "type": "string" - }, - "participants": { - "type": "array", - "items": { - "type": "string" - } - }, - "public_stakes": { - "type": "array", - "items": { - "type": "string" - } - }, - "hidden_stakes": { - "type": "array", - "items": { - "type": "string" - } - }, - "dialogue_context_packs": { - "type": "array", - "items": { - "$ref": "#/$defs/dialogue_context_pack" - } - } - } - }, - "dialogue_context_pack": { - "type": "object", - "required": [ - "speaker_agent_id", - "listener_ids", - "speaker_local_truth", - "speaker_beliefs", - "active_memories", - "active_goals", - "presentation_constraints" - ], - "additionalProperties": false, - "properties": { - "speaker_agent_id": { - "type": "string" - }, - "listener_ids": { - "type": "array", - "items": { - "type": "string" - } - }, - "speaker_local_truth": { - "type": "array", - "items": { - "type": "string" - } - }, - "speaker_beliefs": { - "type": "array", - "items": { - "type": "string" - } - }, - "active_memories": { - "type": "array", - "items": { - "type": "string" - } - }, - "active_goals": { - "type": "array", - "items": { - "type": "string" - } - }, - "presentation_constraints": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "pressure": { - "type": "object", - "required": [ - "pressure_id", - "label", - "intensity" - ], - "additionalProperties": false, - "properties": { - "pressure_id": { - "type": "string" - }, - "label": { - "type": "string" - }, - "intensity": { - "type": "number", - "minimum": 0, - "maximum": 1 - } - } - }, - "inferred_variable_map": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/inferred_state_variable" - } - }, - "inferred_state_variable": { - "type": "object", - "required": [ - "observed_activation", - "attributed_disposition", - "confidence" - ], - "additionalProperties": false, - "properties": { - "observed_activation": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "attributed_disposition": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "confidence": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "evidence": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "event_exchange_turn": { - "type": "object", - "required": [ - "speaker_id", - "utterance_summary", - "dialogue_function" - ], - "additionalProperties": false, - "properties": { - "speaker_id": { - "type": "string" - }, - "utterance_summary": { - "type": "string" - }, - "dialogue_function": { - "type": "string" - }, - "observable_cues": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "event_private_interpretation": { - "type": "object", - "required": [ - "agent_id", - "interpretation", - "confidence" - ], - "additionalProperties": false, - "properties": { - "agent_id": { - "type": "string" - }, - "interpretation": { - "type": "string" - }, - "attributed_motive": { - "type": "string" - }, - "appraisal_tags": { - "type": "array", - "items": { - "type": "string" - } - }, - "confidence": { - "type": "number", - "minimum": 0, - "maximum": 1 - } - } - }, - "event_effect": { - "type": "object", - "required": [ - "agent_id", - "summary" - ], - "additionalProperties": false, - "properties": { - "agent_id": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "state_deltas": { - "type": "array", - "items": { - "$ref": "#/$defs/state_delta" - } - }, - "new_belief_ids": { - "type": "array", - "items": { - "type": "string" - } - }, - "memory_update_ids": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "state_delta": { - "type": "object", - "required": [ - "path", - "delta" - ], - "additionalProperties": false, - "properties": { - "path": { - "type": "string" - }, - "delta": { - "type": "number", - "minimum": -1, - "maximum": 1 - } - } - } - } -} diff --git a/packages/cultnet-ts/integration/contracts/cultnet.discovery-announce.schema.json b/packages/cultnet-ts/integration/contracts/cultnet.discovery-announce.schema.json deleted file mode 100644 index b6cb3abc..00000000 --- a/packages/cultnet-ts/integration/contracts/cultnet.discovery-announce.schema.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.discovery-announce.schema.json", - "title": "CultNet Discovery Announce", - "type": "object", - "required": [ - "schemaVersion", - "messageId", - "runtimeId", - "runtimeKind", - "displayName", - "tcpHost", - "tcpPort", - "wireContract", - "supportedDocumentTypes", - "supportsSchemaCatalog" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.discovery_announce.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "runtimeId": { "type": "string", "minLength": 1 }, - "runtimeKind": { "type": "string", "minLength": 1 }, - "displayName": { "type": "string", "minLength": 1 }, - "agentId": { "type": "string", "minLength": 1 }, - "tcpHost": { "type": "string", "minLength": 1 }, - "tcpPort": { "type": "integer", "minimum": 1, "maximum": 65535 }, - "wireContract": { "const": "cultnet.schema.v0" }, - "supportedDocumentTypes": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "supportsSchemaCatalog": { "type": "boolean" } - } -} diff --git a/packages/cultnet-ts/integration/contracts/cultnet.discovery-probe.schema.json b/packages/cultnet-ts/integration/contracts/cultnet.discovery-probe.schema.json deleted file mode 100644 index b4784bbc..00000000 --- a/packages/cultnet-ts/integration/contracts/cultnet.discovery-probe.schema.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.discovery-probe.schema.json", - "title": "CultNet Discovery Probe", - "type": "object", - "required": [ - "schemaVersion", - "messageId", - "requesterRuntimeId" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.discovery_probe.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "requesterRuntimeId": { "type": "string", "minLength": 1 } - } -} diff --git a/packages/cultnet-ts/package.json b/packages/cultnet-ts/package.json index f94f0bfa..82baeba0 100644 --- a/packages/cultnet-ts/package.json +++ b/packages/cultnet-ts/package.json @@ -17,13 +17,11 @@ } }, "files": [ - "dist", - "contracts" + "dist" ], "scripts": { "contracts:generate": "node tools/generate-swarm-contracts.mjs", "build": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json", - "prepack": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json", "typecheck": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json --pretty false", "test": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test dist-test/test/*.test.js", "test:interop": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test --test-force-exit dist-test/test/interop/*.test.js" diff --git a/packages/cultnet-ts/src/contracts.ts b/packages/cultnet-ts/src/contracts.ts index c71cdcc1..d44f391f 100644 --- a/packages/cultnet-ts/src/contracts.ts +++ b/packages/cultnet-ts/src/contracts.ts @@ -1,38 +1,38 @@ import Ajv2020, { type ValidateFunction } from "ajv/dist/2020"; -import documentRecordSchema from "../contracts/cultnet.document-record.schema.json"; -import helloSchema from "../contracts/cultnet.hello.schema.json"; -import loginSchema from "../contracts/cultnet.login.schema.json"; -import registerSchema from "../contracts/cultnet.register.schema.json"; -import verifySchema from "../contracts/cultnet.verify.schema.json"; -import loginSuccessSchema from "../contracts/cultnet.login-success.schema.json"; -import errorSchema from "../contracts/cultnet.error.schema.json"; -import sampleChangeNameSchema from "../contracts/cultnet.sample-change-name.schema.json"; -import sampleChatSchema from "../contracts/cultnet.sample-chat.schema.json"; -import documentPutSchema from "../contracts/cultnet.document-put.schema.json"; -import documentDeleteSchema from "../contracts/cultnet.document-delete.schema.json"; -import rawDocumentRecordSchema from "../contracts/cultnet.raw-document-record.schema.json"; -import documentPutRawSchema from "../contracts/cultnet.document-put-raw.schema.json"; -import documentMutationContractSchema from "../contracts/cultnet.document-mutation-contract.schema.json"; -import transportProfileSchema from "../contracts/cultnet.transport-profile.schema.json"; -import snapshotRequestSchema from "../contracts/cultnet.snapshot-request.schema.json"; -import snapshotResponseSchema from "../contracts/cultnet.snapshot-response.schema.json"; -import snapshotResponseRawSchema from "../contracts/cultnet.snapshot-response-raw.schema.json"; -import databaseSubscribeSchema from "../contracts/cultnet.database-subscribe.schema.json"; -import databaseUnsubscribeSchema from "../contracts/cultnet.database-unsubscribe.schema.json"; -import databaseChangeRawSchema from "../contracts/cultnet.database-change-raw.schema.json"; -import schemaDescriptorSchema from "../contracts/cultnet.schema-descriptor.schema.json"; -import schemaCatalogRequestSchema from "../contracts/cultnet.schema-catalog-request.schema.json"; -import schemaCatalogResponseSchema from "../contracts/cultnet.schema-catalog-response.schema.json"; -import shardCatalogRequestSchema from "../contracts/cultnet.shard-catalog-request.schema.json"; -import shardCatalogResponseSchema from "../contracts/cultnet.shard-catalog-response.schema.json"; -import operationRequestSchema from "../contracts/cultnet.operation-request.schema.json"; -import operationResponseSchema from "../contracts/cultnet.operation-response.schema.json"; -import verseCatalogRequestSchema from "../contracts/cultmesh.verse-catalog-request.schema.json"; -import verseCatalogResponseSchema from "../contracts/cultmesh.verse-catalog-response.schema.json"; -import sessionOpenSchema from "../contracts/cultmesh.session-open.schema.json"; -import sessionAcceptedSchema from "../contracts/cultmesh.session-accepted.schema.json"; -import ghostlightAgentStateSchema from "../contracts/ghostlight.agent-state.schema.json"; +import documentRecordSchema from "../../../contracts/cultnet/cultnet.document-record.schema.json"; +import helloSchema from "../../../contracts/cultnet/cultnet.hello.schema.json"; +import loginSchema from "../../../contracts/cultnet/cultnet.login.schema.json"; +import registerSchema from "../../../contracts/cultnet/cultnet.register.schema.json"; +import verifySchema from "../../../contracts/cultnet/cultnet.verify.schema.json"; +import loginSuccessSchema from "../../../contracts/cultnet/cultnet.login-success.schema.json"; +import errorSchema from "../../../contracts/cultnet/cultnet.error.schema.json"; +import sampleChangeNameSchema from "../../../contracts/cultnet/cultnet.sample-change-name.schema.json"; +import sampleChatSchema from "../../../contracts/cultnet/cultnet.sample-chat.schema.json"; +import documentPutSchema from "../../../contracts/cultnet/cultnet.document-put.schema.json"; +import documentDeleteSchema from "../../../contracts/cultnet/cultnet.document-delete.schema.json"; +import rawDocumentRecordSchema from "../../../contracts/cultnet/cultnet.raw-document-record.schema.json"; +import documentPutRawSchema from "../../../contracts/cultnet/cultnet.document-put-raw.schema.json"; +import documentMutationContractSchema from "../../../contracts/cultnet/cultnet.document-mutation-contract.schema.json"; +import transportProfileSchema from "../../../contracts/cultnet/cultnet.transport-profile.schema.json"; +import snapshotRequestSchema from "../../../contracts/cultnet/cultnet.snapshot-request.schema.json"; +import snapshotResponseSchema from "../../../contracts/cultnet/cultnet.snapshot-response.schema.json"; +import snapshotResponseRawSchema from "../../../contracts/cultnet/cultnet.snapshot-response-raw.schema.json"; +import databaseSubscribeSchema from "../../../contracts/cultnet/cultnet.database-subscribe.schema.json"; +import databaseUnsubscribeSchema from "../../../contracts/cultnet/cultnet.database-unsubscribe.schema.json"; +import databaseChangeRawSchema from "../../../contracts/cultnet/cultnet.database-change-raw.schema.json"; +import schemaDescriptorSchema from "../../../contracts/cultnet/cultnet.schema-descriptor.schema.json"; +import schemaCatalogRequestSchema from "../../../contracts/cultnet/cultnet.schema-catalog-request.schema.json"; +import schemaCatalogResponseSchema from "../../../contracts/cultnet/cultnet.schema-catalog-response.schema.json"; +import shardCatalogRequestSchema from "../../../contracts/cultnet/cultnet.shard-catalog-request.schema.json"; +import shardCatalogResponseSchema from "../../../contracts/cultnet/cultnet.shard-catalog-response.schema.json"; +import operationRequestSchema from "../../../contracts/cultnet/cultnet.operation-request.schema.json"; +import operationResponseSchema from "../../../contracts/cultnet/cultnet.operation-response.schema.json"; +import verseCatalogRequestSchema from "../../../contracts/cultnet/cultmesh.verse-catalog-request.schema.json"; +import verseCatalogResponseSchema from "../../../contracts/cultnet/cultmesh.verse-catalog-response.schema.json"; +import sessionOpenSchema from "../../../contracts/cultnet/cultmesh.session-open.schema.json"; +import sessionAcceptedSchema from "../../../contracts/cultnet/cultmesh.session-accepted.schema.json"; +import ghostlightAgentStateSchema from "../../../contracts/cultnet/ghostlight.agent-state.schema.json"; export type CultNetWireContract = "cultnet.schema.v0" | "gamecult.networking.v0"; diff --git a/packages/cultnet-ts/src/generated/swarm-contracts.generated.ts b/packages/cultnet-ts/src/generated/swarm-contracts.generated.ts index f6f673a3..84bb09b0 100644 --- a/packages/cultnet-ts/src/generated/swarm-contracts.generated.ts +++ b/packages/cultnet-ts/src/generated/swarm-contracts.generated.ts @@ -1,5 +1,5 @@ import { defineJsonSchemaContract } from "../json-schema-contract"; -import ghostlightAgentStateGeneratedContractSchema from "../../contracts/ghostlight.agent-state.schema.json"; +import ghostlightAgentStateGeneratedContractSchema from "../../../../contracts/cultnet/ghostlight.agent-state.schema.json"; // Generated by tools/generate-swarm-contracts.mjs. Do not hand-edit this file unless you enjoy losing arguments with a machine. diff --git a/packages/cultnet-ts/test/interop/cultnet-interop-shared.ts b/packages/cultnet-ts/test/interop/cultnet-interop-shared.ts index e810ecbd..a7ae54e1 100644 --- a/packages/cultnet-ts/test/interop/cultnet-interop-shared.ts +++ b/packages/cultnet-ts/test/interop/cultnet-interop-shared.ts @@ -7,16 +7,16 @@ import { z } from "zod"; export const INTEROP_DOCUMENT_TYPE = "cultnet.interop-note"; export const INTEROP_SCHEMA_VERSION = "cultnet.interop_note.v0"; export const INTEROP_MUTATION_INTENT_DOCUMENT_TYPE = "cultnet.interop-note-mutation-intent"; -export const INTEROP_MUTATION_INTENT_SCHEMA_ID = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-note-mutation-intent.schema.json"; +export const INTEROP_MUTATION_INTENT_SCHEMA_ID = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-note-mutation-intent.schema.json"; export const INTEROP_MUTATION_INTENT_SCHEMA_VERSION = "cultnet.interop_note_mutation_intent.v0"; export const INTEROP_MUTATION_RECEIPT_DOCUMENT_TYPE = "cultnet.interop-note-mutation-receipt"; -export const INTEROP_MUTATION_RECEIPT_SCHEMA_ID = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-note-mutation-receipt.schema.json"; +export const INTEROP_MUTATION_RECEIPT_SCHEMA_ID = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-note-mutation-receipt.schema.json"; export const INTEROP_MUTATION_RECEIPT_SCHEMA_VERSION = "cultnet.interop_note_mutation_receipt.v0"; export const INTEROP_FIRE_COMMAND_DOCUMENT_TYPE = "cultnet.interop-fire-weapon-command"; -export const INTEROP_FIRE_COMMAND_SCHEMA_ID = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-fire-weapon-command.schema.json"; +export const INTEROP_FIRE_COMMAND_SCHEMA_ID = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-fire-weapon-command.schema.json"; export const INTEROP_FIRE_COMMAND_SCHEMA_VERSION = "cultnet.interop_fire_weapon_command.v0"; export const INTEROP_FIRE_RECEIPT_DOCUMENT_TYPE = "cultnet.interop-fire-weapon-receipt"; -export const INTEROP_FIRE_RECEIPT_SCHEMA_ID = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-fire-weapon-receipt.schema.json"; +export const INTEROP_FIRE_RECEIPT_SCHEMA_ID = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-fire-weapon-receipt.schema.json"; export const INTEROP_FIRE_RECEIPT_SCHEMA_VERSION = "cultnet.interop_fire_weapon_receipt.v0"; export const INTEROP_WIRE_CONTRACT = "cultnet.schema.v0" as const; export const DISCOVERY_PROBE_SCHEMA_VERSION = "cultnet.discovery_probe.v0"; diff --git a/packages/cultnet-ts/test/interop/cultnet-interop.test.ts b/packages/cultnet-ts/test/interop/cultnet-interop.test.ts index 00fff83d..51bea1ff 100644 --- a/packages/cultnet-ts/test/interop/cultnet-interop.test.ts +++ b/packages/cultnet-ts/test/interop/cultnet-interop.test.ts @@ -39,9 +39,9 @@ const cultnetRsRoot = existsSync(resolve(cultLibRoot, "packages", "cultnet-rs")) : resolve(cultNetTsRoot, "..", "cultnet-rs"); const tsPeerScript = resolve(cultNetTsRoot, "dist-test", "test", "interop", "cultnet-interop-peer.js"); -const interopSchemaPath = resolve(cultNetTsRoot, "integration", "contracts", "cultnet.interop-note.schema.json"); -const interopNoteSchemaId = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-note.schema.json"; -const witnessArtifactBundleSchemaId = "https://github.com/GameCult/cultnet-ts/contracts/cultnet.witness-artifact-bundle.schema.json"; +const interopSchemaPath = resolve(cultNetTsRoot, "..", "..", "contracts", "cultnet", "interop", "cultnet.interop-note.schema.json"); +const interopNoteSchemaId = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-note.schema.json"; +const witnessArtifactBundleSchemaId = "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.witness-artifact-bundle.schema.json"; const simulationFactSchemaId = "gamecult.mesh.simulation_fact"; const csharpProjectPath = resolve( cultLibRoot, diff --git a/packages/cultnet-ts/tools/generate-swarm-contracts.mjs b/packages/cultnet-ts/tools/generate-swarm-contracts.mjs index f74aff98..53ad1e18 100644 --- a/packages/cultnet-ts/tools/generate-swarm-contracts.mjs +++ b/packages/cultnet-ts/tools/generate-swarm-contracts.mjs @@ -7,7 +7,7 @@ import { compile } from "json-schema-to-typescript"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const repoRoot = path.resolve(__dirname, ".."); -const manifestPath = path.join(repoRoot, "contracts", "swarm-contracts.manifest.json"); +const manifestPath = path.join(repoRoot, "tools", "swarm-contracts.manifest.json"); const outputPath = path.join(repoRoot, "src", "generated", "swarm-contracts.generated.ts"); /** diff --git a/packages/cultnet-ts/contracts/swarm-contracts.manifest.json b/packages/cultnet-ts/tools/swarm-contracts.manifest.json similarity index 76% rename from packages/cultnet-ts/contracts/swarm-contracts.manifest.json rename to packages/cultnet-ts/tools/swarm-contracts.manifest.json index 1c08e8fa..49b5073d 100644 --- a/packages/cultnet-ts/contracts/swarm-contracts.manifest.json +++ b/packages/cultnet-ts/tools/swarm-contracts.manifest.json @@ -1,7 +1,7 @@ { "contracts": [ { - "schemaPath": "./ghostlight.agent-state.schema.json", + "schemaPath": "../../../contracts/cultnet/ghostlight.agent-state.schema.json", "typeName": "GhostlightAgentStateShape", "contractExportName": "ghostlightAgentStateGeneratedContract", "validateExportName": "validateGhostlightAgentStateGenerated", diff --git a/src/GameCult.Networking/Contracts/cultnet.database-change-raw.schema.json b/src/GameCult.Networking/Contracts/cultnet.database-change-raw.schema.json deleted file mode 100644 index dd650fa0..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.database-change-raw.schema.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.database-change-raw.schema.json", - "title": "CultNet Raw Database Change Message", - "type": "object", - "required": ["schemaVersion", "messageId", "subscriptionId", "changeKind"], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.database_change_raw.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "subscriptionId": { "type": "string", "minLength": 1 }, - "changeKind": { "enum": ["added", "updated", "removed"] }, - "document": { "$ref": "./cultnet.raw-document-record.schema.json" }, - "recordKey": { "type": "string", "minLength": 1 }, - "schemaId": { "type": "string", "minLength": 1 } - }, - "allOf": [ - { - "if": { "properties": { "changeKind": { "const": "removed" } } }, - "then": { "required": ["recordKey", "schemaId"] }, - "else": { "required": ["document"] } - } - ] -} diff --git a/src/GameCult.Networking/Contracts/cultnet.database-subscribe.schema.json b/src/GameCult.Networking/Contracts/cultnet.database-subscribe.schema.json deleted file mode 100644 index 08304199..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.database-subscribe.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.database-subscribe.schema.json", - "title": "CultNet Database Subscribe Message", - "type": "object", - "required": ["schemaVersion", "messageId", "subscriptionId", "includeSnapshot"], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.database_subscribe.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "subscriptionId": { "type": "string", "minLength": 1 }, - "schemaIds": { "type": "array", "items": { "type": "string", "minLength": 1 } }, - "recordKeys": { "type": "array", "items": { "type": "string", "minLength": 1 } }, - "includeSnapshot": { "type": "boolean" }, - "consumerRuntimeId": { "type": "string", "minLength": 1 }, - "bodyIds": { "type": "array", "items": { "type": "string", "minLength": 1 } }, - "supportedBodyTransports": { "type": "array", "items": { "type": "string", "minLength": 1 } } - } -} diff --git a/src/GameCult.Networking/Contracts/cultnet.database-unsubscribe.schema.json b/src/GameCult.Networking/Contracts/cultnet.database-unsubscribe.schema.json deleted file mode 100644 index 7d4b0855..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.database-unsubscribe.schema.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.database-unsubscribe.schema.json", - "title": "CultNet Database Unsubscribe Message", - "type": "object", - "required": ["schemaVersion", "messageId", "subscriptionId"], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.database_unsubscribe.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "subscriptionId": { "type": "string", "minLength": 1 } - } -} diff --git a/src/GameCult.Networking/Contracts/cultnet.document-delete.schema.json b/src/GameCult.Networking/Contracts/cultnet.document-delete.schema.json deleted file mode 100644 index 265bcaf2..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.document-delete.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-delete.schema.json", - "title": "CultNet Document Delete Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId", - "schemaId", - "recordKey" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.document_delete.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "schemaId": { "type": "string", "minLength": 1 }, - "recordKey": { "type": "string", "minLength": 1 } - } -} diff --git a/src/GameCult.Networking/Contracts/cultnet.document-put-raw.schema.json b/src/GameCult.Networking/Contracts/cultnet.document-put-raw.schema.json deleted file mode 100644 index 3c178d03..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.document-put-raw.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-put-raw.schema.json", - "title": "CultNet Raw Document Put Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId", - "document" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.document_put_raw.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "document": { - "$ref": "./cultnet.raw-document-record.schema.json" - } - } -} diff --git a/src/GameCult.Networking/Contracts/cultnet.error.schema.json b/src/GameCult.Networking/Contracts/cultnet.error.schema.json deleted file mode 100644 index af6da9cf..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.error.schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.error.schema.json", - "title": "CultNet Error Message", - "type": "object", - "required": [ - "schemaVersion", - "error" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.error.v0" }, - "error": { "type": "string", "minLength": 1 } - } -} diff --git a/src/GameCult.Networking/Contracts/cultnet.login-success.schema.json b/src/GameCult.Networking/Contracts/cultnet.login-success.schema.json deleted file mode 100644 index 3d8a4591..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.login-success.schema.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.login-success.schema.json", - "title": "CultNet Login Success Message", - "type": "object", - "required": [ - "schemaVersion", - "nonce", - "session" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.login_success.v0" }, - "nonce": { "type": "string", "minLength": 1 }, - "session": { "type": "string", "minLength": 1 } - } -} diff --git a/src/GameCult.Networking/Contracts/cultnet.login.schema.json b/src/GameCult.Networking/Contracts/cultnet.login.schema.json deleted file mode 100644 index 62f49599..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.login.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.login.schema.json", - "title": "CultNet Login Message", - "type": "object", - "required": [ - "schemaVersion", - "nonce", - "auth", - "password" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.login.v0" }, - "nonce": { "type": "string", "minLength": 1 }, - "auth": { "type": "string", "minLength": 1 }, - "password": { "type": "string", "minLength": 1 } - } -} diff --git a/src/GameCult.Networking/Contracts/cultnet.operation-response.schema.json b/src/GameCult.Networking/Contracts/cultnet.operation-response.schema.json deleted file mode 100644 index c3be917d..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.operation-response.schema.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.operation-response.schema.json", - "title": "CultNet Operation Response", - "type": "object", - "required": ["schemaVersion", "messageId", "serviceId", "operation", "status", "payloadSchema", "payload"], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.operation_response.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "serviceId": { "type": "string", "minLength": 1 }, - "operation": { "type": "string", "minLength": 1 }, - "status": { "type": "string", "minLength": 1 }, - "payloadSchema": { "type": "string", "minLength": 1 }, - "payloadEncoding": { "const": "messagepack-base64" }, - "payload": { "type": "string", "minLength": 1, "contentEncoding": "base64" }, - "diagnostics": { "type": "array", "items": { "type": "string" } }, - "sourceRuntimeId": { "type": "string", "minLength": 1 } - } -} diff --git a/src/GameCult.Networking/Contracts/cultnet.register.schema.json b/src/GameCult.Networking/Contracts/cultnet.register.schema.json deleted file mode 100644 index 77286f3e..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.register.schema.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.register.schema.json", - "title": "CultNet Register Message", - "type": "object", - "required": [ - "schemaVersion", - "nonce", - "email", - "password", - "name" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.register.v0" }, - "nonce": { "type": "string", "minLength": 1 }, - "email": { "type": "string", "minLength": 1 }, - "password": { "type": "string", "minLength": 1 }, - "name": { "type": "string", "minLength": 1 } - } -} diff --git a/src/GameCult.Networking/Contracts/cultnet.sample-change-name.schema.json b/src/GameCult.Networking/Contracts/cultnet.sample-change-name.schema.json deleted file mode 100644 index fc3fe057..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.sample-change-name.schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.sample-change-name.schema.json", - "title": "CultNet Sample Change Name Message", - "type": "object", - "required": [ - "schemaVersion", - "name" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.sample.change_name.v0" }, - "name": { "type": "string", "minLength": 1 } - } -} diff --git a/src/GameCult.Networking/Contracts/cultnet.schema-catalog-request.schema.json b/src/GameCult.Networking/Contracts/cultnet.schema-catalog-request.schema.json deleted file mode 100644 index 611733d2..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.schema-catalog-request.schema.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.schema-catalog-request.schema.json", - "title": "CultNet Schema Catalog Request Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.schema_catalog_request.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "includeSchemaJson": { "type": "boolean" }, - "schemaIds": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "kinds": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "wire_message", - "document_payload", - "shared_contract" - ] - } - } - } -} diff --git a/src/GameCult.Networking/Contracts/cultnet.snapshot-request.schema.json b/src/GameCult.Networking/Contracts/cultnet.snapshot-request.schema.json deleted file mode 100644 index 712d7059..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.snapshot-request.schema.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.snapshot-request.schema.json", - "title": "CultNet Snapshot Request Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.snapshot_request.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "schemaIds": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "recordKeys": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - } - } -} diff --git a/src/GameCult.Networking/Contracts/cultnet.snapshot-response-raw.schema.json b/src/GameCult.Networking/Contracts/cultnet.snapshot-response-raw.schema.json deleted file mode 100644 index a84bc50d..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.snapshot-response-raw.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.snapshot-response-raw.schema.json", - "title": "CultNet Raw Snapshot Response Message", - "type": "object", - "required": [ - "schemaVersion", - "messageId", - "documents" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.snapshot_response_raw.v0" }, - "messageId": { "type": "string", "minLength": 1 }, - "documents": { - "type": "array", - "items": { - "$ref": "./cultnet.raw-document-record.schema.json" - } - } - } -} diff --git a/src/GameCult.Networking/Contracts/cultnet.transport-profile.schema.json b/src/GameCult.Networking/Contracts/cultnet.transport-profile.schema.json deleted file mode 100644 index 90261c79..00000000 --- a/src/GameCult.Networking/Contracts/cultnet.transport-profile.schema.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/cultnet-ts/contracts/cultnet.transport-profile.schema.json", - "title": "CultNet Transport Profile", - "type": "object", - "required": [ - "schemaVersion", - "runtimeId", - "transports" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.transport_profile.v0" }, - "runtimeId": { "type": "string", "minLength": 1 }, - "transports": { - "type": "array", - "items": { - "type": "object", - "required": [ - "transportId", - "protocol", - "channels" - ], - "additionalProperties": false, - "properties": { - "transportId": { "type": "string", "minLength": 1 }, - "protocol": { - "type": "string", - "enum": [ - "tcp_framed", - "litenetlib", - "websocket", - "rudp" - ] - }, - "host": { "type": "string", "minLength": 1 }, - "port": { "type": "integer", "minimum": 1, "maximum": 65535 }, - "path": { "type": "string", "minLength": 1 }, - "discoveryGroup": { "type": "string", "minLength": 1 }, - "wireContracts": { - "type": "array", - "items": { "type": "string", "minLength": 1 } - }, - "reconnectPolicy": { - "type": "object", - "required": [ - "schemaVersion", - "policyId", - "baseDelayMs", - "maxDelayMs", - "maxJitterMs" - ], - "additionalProperties": false, - "properties": { - "schemaVersion": { "const": "cultnet.reconnect_policy.v0" }, - "policyId": { "type": "string", "minLength": 1 }, - "baseDelayMs": { "type": "integer", "minimum": 0 }, - "maxDelayMs": { "type": "integer", "minimum": 0 }, - "maxJitterMs": { "type": "integer", "minimum": 0 }, - "maxAttempts": { "type": "integer", "minimum": 1 } - } - }, - "channels": { - "type": "array", - "items": { - "type": "object", - "required": [ - "channelId", - "delivery", - "ordering" - ], - "additionalProperties": false, - "properties": { - "channelId": { "type": "string", "minLength": 1 }, - "delivery": { - "type": "string", - "enum": [ - "reliable", - "unreliable" - ] - }, - "ordering": { - "type": "string", - "enum": [ - "ordered", - "unordered", - "sequenced" - ] - }, - "maxPayloadBytes": { "type": "integer", "minimum": 1 }, - "maxFragmentBytes": { "type": "integer", "minimum": 1 }, - "maxPendingReliablePackets": { "type": "integer", "minimum": 1 } - } - } - } - } - } - } - } -} diff --git a/src/GameCult.Networking/Contracts/ghostlight.agent-state.schema.json b/src/GameCult.Networking/Contracts/ghostlight.agent-state.schema.json deleted file mode 100644 index 6437cd01..00000000 --- a/src/GameCult.Networking/Contracts/ghostlight.agent-state.schema.json +++ /dev/null @@ -1,845 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/GameCult/Ghostlight/schemas/agent-state.schema.json", - "title": "Ghostlight Agent State Schema", - "description": "First canonical contract for Ghostlight agent, perception, relationship, event, scene, and dialogue-context state.", - "type": "object", - "required": [ - "schema_version", - "world", - "agents", - "relationships", - "events", - "scenes" - ], - "additionalProperties": false, - "properties": { - "schema_version": { - "const": "ghostlight.agent_state.v0" - }, - "world": { - "$ref": "#/$defs/world_state" - }, - "agents": { - "type": "array", - "items": { - "$ref": "#/$defs/agent" - } - }, - "relationships": { - "type": "array", - "items": { - "$ref": "#/$defs/relationship" - } - }, - "events": { - "type": "array", - "items": { - "$ref": "#/$defs/event" - } - }, - "scenes": { - "type": "array", - "items": { - "$ref": "#/$defs/scene" - } - } - }, - "$defs": { - "world_state": { - "type": "object", - "required": [ - "world_id", - "setting", - "time", - "canon_context" - ], - "additionalProperties": false, - "properties": { - "world_id": { - "type": "string" - }, - "setting": { - "type": "string" - }, - "time": { - "type": "object", - "required": [ - "label" - ], - "additionalProperties": true, - "properties": { - "label": { - "type": "string" - } - } - }, - "canon_context": { - "type": "array", - "items": { - "type": "string" - } - }, - "ambient_pressures": { - "type": "array", - "items": { - "$ref": "#/$defs/pressure" - } - } - } - }, - "agent": { - "type": "object", - "required": [ - "agent_id", - "identity", - "canonical_state", - "goals", - "memories", - "perceived_state_overlays" - ], - "additionalProperties": false, - "properties": { - "agent_id": { - "type": "string" - }, - "identity": { - "$ref": "#/$defs/identity" - }, - "canonical_state": { - "$ref": "#/$defs/canonical_state" - }, - "goals": { - "type": "array", - "items": { - "$ref": "#/$defs/goal" - } - }, - "memories": { - "$ref": "#/$defs/memory_bundle" - }, - "perceived_state_overlays": { - "type": "array", - "items": { - "$ref": "#/$defs/perceived_state_overlay" - } - } - } - }, - "identity": { - "type": "object", - "required": [ - "name", - "roles", - "origin", - "public_description" - ], - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "roles": { - "type": "array", - "items": { - "type": "string" - } - }, - "origin": { - "type": "string" - }, - "public_description": { - "type": "string" - }, - "private_notes": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "canonical_state": { - "type": "object", - "required": [ - "underlying_organization", - "stable_dispositions", - "behavioral_dimensions", - "presentation_strategy", - "voice_style", - "situational_state", - "values" - ], - "additionalProperties": false, - "properties": { - "underlying_organization": { - "$ref": "#/$defs/variable_map" - }, - "stable_dispositions": { - "$ref": "#/$defs/variable_map" - }, - "behavioral_dimensions": { - "$ref": "#/$defs/variable_map" - }, - "presentation_strategy": { - "$ref": "#/$defs/variable_map" - }, - "situational_state": { - "$ref": "#/$defs/variable_map" - }, - "values": { - "type": "array", - "items": { - "$ref": "#/$defs/value_commitment" - } - }, - "voice_style": { - "$ref": "#/$defs/variable_map" - } - } - }, - "variable_map": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/state_variable" - } - }, - "state_variable": { - "type": "object", - "required": [ - "mean", - "plasticity", - "current_activation" - ], - "additionalProperties": false, - "properties": { - "mean": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "plasticity": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "current_activation": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "evidence": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "value_commitment": { - "type": "object", - "required": [ - "value_id", - "label", - "priority", - "unforgivable_if_betrayed" - ], - "additionalProperties": false, - "properties": { - "value_id": { - "type": "string" - }, - "label": { - "type": "string" - }, - "priority": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "unforgivable_if_betrayed": { - "type": "boolean" - } - } - }, - "goal": { - "type": "object", - "required": [ - "goal_id", - "description", - "scope", - "priority", - "emotional_stake", - "status" - ], - "additionalProperties": false, - "properties": { - "goal_id": { - "type": "string" - }, - "description": { - "type": "string" - }, - "scope": { - "enum": [ - "immediate", - "scene", - "case", - "arc", - "life" - ] - }, - "priority": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "emotional_stake": { - "type": "string" - }, - "blockers": { - "type": "array", - "items": { - "type": "string" - } - }, - "status": { - "enum": [ - "active", - "blocked", - "dormant", - "resolved", - "abandoned" - ] - } - } - }, - "memory_bundle": { - "type": "object", - "required": [ - "episodic", - "semantic", - "relationship_summaries" - ], - "additionalProperties": false, - "properties": { - "episodic": { - "type": "array", - "items": { - "$ref": "#/$defs/memory" - } - }, - "semantic": { - "type": "array", - "items": { - "$ref": "#/$defs/memory" - } - }, - "relationship_summaries": { - "type": "array", - "items": { - "$ref": "#/$defs/memory" - } - } - } - }, - "memory": { - "type": "object", - "required": [ - "memory_id", - "summary", - "salience", - "confidence" - ], - "additionalProperties": false, - "properties": { - "memory_id": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "salience": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "confidence": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "linked_event_ids": { - "type": "array", - "items": { - "type": "string" - } - }, - "linked_relationship_id": { - "type": "string" - } - } - }, - "perceived_state_overlay": { - "type": "object", - "required": [ - "observer_agent_id", - "target_agent_id", - "perceived_dimensions", - "beliefs", - "distortions" - ], - "additionalProperties": false, - "properties": { - "observer_agent_id": { - "type": "string" - }, - "target_agent_id": { - "type": "string" - }, - "perceived_dimensions": { - "$ref": "#/$defs/inferred_variable_map" - }, - "beliefs": { - "type": "array", - "items": { - "$ref": "#/$defs/belief" - } - }, - "distortions": { - "type": "array", - "items": { - "enum": [ - "hostile_attribution", - "false_reassurance", - "overread_warmth", - "underread_threat", - "false_mask_detection", - "missed_mask_detection", - "status_injury", - "threat_amplification", - "institutional_suspicion_transfer", - "care_underread", - "mask_overfocus" - ] - } - } - } - }, - "belief": { - "type": "object", - "required": [ - "belief_id", - "claim", - "confidence" - ], - "additionalProperties": false, - "properties": { - "belief_id": { - "type": "string" - }, - "claim": { - "type": "string" - }, - "confidence": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "subject_id": { - "type": "string" - }, - "claim_type": { - "enum": [ - "fact", - "identity_inference", - "motive_inference", - "prediction", - "norm", - "value_read", - "relationship_read" - ] - }, - "evidence_event_ids": { - "type": "array", - "items": { - "type": "string" - } - }, - "visibility": { - "enum": [ - "private", - "shared", - "public", - "rumor" - ] - }, - "emotional_charge": { - "type": "number", - "minimum": 0, - "maximum": 1 - } - } - }, - "relationship": { - "type": "object", - "required": [ - "relationship_id", - "source_id", - "target_id", - "stance", - "summary" - ], - "additionalProperties": false, - "properties": { - "relationship_id": { - "type": "string" - }, - "source_id": { - "type": "string" - }, - "target_id": { - "type": "string" - }, - "stance": { - "$ref": "#/$defs/variable_map" - }, - "summary": { - "type": "string" - }, - "unresolved_incident_ids": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "event": { - "type": "object", - "required": [ - "event_id", - "kind", - "summary", - "participants", - "pressure_tags" - ], - "additionalProperties": false, - "properties": { - "event_id": { - "type": "string" - }, - "kind": { - "enum": [ - "dialogue", - "action", - "memory", - "relationship_shift", - "scene_outcome", - "author_note" - ] - }, - "summary": { - "type": "string" - }, - "participants": { - "type": "array", - "items": { - "type": "string" - } - }, - "pressure_tags": { - "type": "array", - "items": { - "type": "string" - } - }, - "observed_exchange": { - "type": "array", - "items": { - "$ref": "#/$defs/event_exchange_turn" - } - }, - "private_interpretations": { - "type": "array", - "items": { - "$ref": "#/$defs/event_private_interpretation" - } - }, - "event_effects": { - "type": "array", - "items": { - "$ref": "#/$defs/event_effect" - } - } - } - }, - "scene": { - "type": "object", - "required": [ - "scene_id", - "location", - "participants", - "public_stakes", - "hidden_stakes", - "dialogue_context_packs" - ], - "additionalProperties": false, - "properties": { - "scene_id": { - "type": "string" - }, - "location": { - "type": "string" - }, - "participants": { - "type": "array", - "items": { - "type": "string" - } - }, - "public_stakes": { - "type": "array", - "items": { - "type": "string" - } - }, - "hidden_stakes": { - "type": "array", - "items": { - "type": "string" - } - }, - "dialogue_context_packs": { - "type": "array", - "items": { - "$ref": "#/$defs/dialogue_context_pack" - } - } - } - }, - "dialogue_context_pack": { - "type": "object", - "required": [ - "speaker_agent_id", - "listener_ids", - "speaker_local_truth", - "speaker_beliefs", - "active_memories", - "active_goals", - "presentation_constraints" - ], - "additionalProperties": false, - "properties": { - "speaker_agent_id": { - "type": "string" - }, - "listener_ids": { - "type": "array", - "items": { - "type": "string" - } - }, - "speaker_local_truth": { - "type": "array", - "items": { - "type": "string" - } - }, - "speaker_beliefs": { - "type": "array", - "items": { - "type": "string" - } - }, - "active_memories": { - "type": "array", - "items": { - "type": "string" - } - }, - "active_goals": { - "type": "array", - "items": { - "type": "string" - } - }, - "presentation_constraints": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "pressure": { - "type": "object", - "required": [ - "pressure_id", - "label", - "intensity" - ], - "additionalProperties": false, - "properties": { - "pressure_id": { - "type": "string" - }, - "label": { - "type": "string" - }, - "intensity": { - "type": "number", - "minimum": 0, - "maximum": 1 - } - } - }, - "inferred_variable_map": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/inferred_state_variable" - } - }, - "inferred_state_variable": { - "type": "object", - "required": [ - "observed_activation", - "attributed_disposition", - "confidence" - ], - "additionalProperties": false, - "properties": { - "observed_activation": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "attributed_disposition": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "confidence": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "evidence": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "event_exchange_turn": { - "type": "object", - "required": [ - "speaker_id", - "utterance_summary", - "dialogue_function" - ], - "additionalProperties": false, - "properties": { - "speaker_id": { - "type": "string" - }, - "utterance_summary": { - "type": "string" - }, - "dialogue_function": { - "type": "string" - }, - "observable_cues": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "event_private_interpretation": { - "type": "object", - "required": [ - "agent_id", - "interpretation", - "confidence" - ], - "additionalProperties": false, - "properties": { - "agent_id": { - "type": "string" - }, - "interpretation": { - "type": "string" - }, - "attributed_motive": { - "type": "string" - }, - "appraisal_tags": { - "type": "array", - "items": { - "type": "string" - } - }, - "confidence": { - "type": "number", - "minimum": 0, - "maximum": 1 - } - } - }, - "event_effect": { - "type": "object", - "required": [ - "agent_id", - "summary" - ], - "additionalProperties": false, - "properties": { - "agent_id": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "state_deltas": { - "type": "array", - "items": { - "$ref": "#/$defs/state_delta" - } - }, - "new_belief_ids": { - "type": "array", - "items": { - "type": "string" - } - }, - "memory_update_ids": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "state_delta": { - "type": "object", - "required": [ - "path", - "delta" - ], - "additionalProperties": false, - "properties": { - "path": { - "type": "string" - }, - "delta": { - "type": "number", - "minimum": -1, - "maximum": 1 - } - } - } - } -} diff --git a/src/GameCult.Networking/GameCult.Networking.csproj b/src/GameCult.Networking/GameCult.Networking.csproj index f275484f..7f9024eb 100644 --- a/src/GameCult.Networking/GameCult.Networking.csproj +++ b/src/GameCult.Networking/GameCult.Networking.csproj @@ -18,6 +18,6 @@ - + diff --git a/tests/GameCult.Networking.InteropPeer/Program.cs b/tests/GameCult.Networking.InteropPeer/Program.cs index 953ee097..2c0f51ce 100644 --- a/tests/GameCult.Networking.InteropPeer/Program.cs +++ b/tests/GameCult.Networking.InteropPeer/Program.cs @@ -1452,16 +1452,16 @@ static class InteropPeerShared public const string InteropDocumentType = "cultnet.interop-note"; public const string InteropSchemaVersion = "cultnet.interop_note.v0"; public const string MutationIntentDocumentType = "cultnet.interop-note-mutation-intent"; - public const string MutationIntentSchemaId = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-note-mutation-intent.schema.json"; + public const string MutationIntentSchemaId = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-note-mutation-intent.schema.json"; public const string MutationIntentSchemaVersion = "cultnet.interop_note_mutation_intent.v0"; public const string MutationReceiptDocumentType = "cultnet.interop-note-mutation-receipt"; - public const string MutationReceiptSchemaId = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-note-mutation-receipt.schema.json"; + public const string MutationReceiptSchemaId = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-note-mutation-receipt.schema.json"; public const string MutationReceiptSchemaVersion = "cultnet.interop_note_mutation_receipt.v0"; public const string FireCommandDocumentType = "cultnet.interop-fire-weapon-command"; - public const string FireCommandSchemaId = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-fire-weapon-command.schema.json"; + public const string FireCommandSchemaId = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-fire-weapon-command.schema.json"; public const string FireCommandSchemaVersion = "cultnet.interop_fire_weapon_command.v0"; public const string FireReceiptDocumentType = "cultnet.interop-fire-weapon-receipt"; - public const string FireReceiptSchemaId = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-fire-weapon-receipt.schema.json"; + public const string FireReceiptSchemaId = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-fire-weapon-receipt.schema.json"; public const string FireReceiptSchemaVersion = "cultnet.interop_fire_weapon_receipt.v0"; public const string DiscoveryProbeSchemaVersion = "cultnet.discovery_probe.v0"; public const string DiscoveryAnnounceSchemaVersion = "cultnet.discovery_announce.v0"; From fa00f3ffa21c172ea467fcd0e8f9342077b4e3c0 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 13 Sep 2026 17:43:55 +0200 Subject: [PATCH 02/94] Fix cultnet-ts test build for out-of-package contract location REC-032 commit 1 follow-up, found during required verification: moving the CultNet schemas out of packages/cultnet-ts/contracts into CultLib/contracts/cultnet broke npm test for cultnet-ts. tsconfig.test.json compiled with rootDir "." (to cover both src/ and test/ as siblings), and TypeScript's resolveJsonModule copy-into-output behavior only mirrors files that fall within the declared rootDir. The old contracts/ folder was a sibling of src/ (inside rootDir), so it got copied into dist-test/contracts and the "../contracts/x" import resolved. The new contracts/cultnet is two directories above the package, outside any possible rootDir short of the repo root, so nothing got copied and the "../../../contracts/cultnet/x" import 404'd at runtime under dist-test (the production "dist" build was unaffected, since dist/ and src/ sit at the same depth under the package). Fix: widen tsconfig.test.json's rootDir to the CultLib repo root so resolveJsonModule can find and copy contracts/cultnet into dist-test, update the "test"/"test:interop" npm scripts for the resulting deeper dist-test/packages/cultnet-ts/... output path, and correct the two __dirname-relative computations in test/interop/cultnet-interop.test.ts and test/runtime-presence-health.test.ts that assumed the old shallower depth. Also fixes packages/cultmesh-ts/test/cultmesh.test.ts, which still looked up the shard-catalog builtins by their old bare cultnet.shard_catalog_{request,response}.v0 schemaId; CultNetSchemaCatalog keys by $id, which D1 changed to the CultLib contracts URL, so the lookup returned undefined. REC-032, decision D1. Co-Authored-By: Claude Sonnet 5 --- packages/cultmesh-ts/test/cultmesh.test.ts | 8 ++++++-- packages/cultnet-ts/package.json | 4 ++-- packages/cultnet-ts/test/interop/cultnet-interop.test.ts | 2 +- packages/cultnet-ts/test/runtime-presence-health.test.ts | 2 +- packages/cultnet-ts/tsconfig.test.json | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/cultmesh-ts/test/cultmesh.test.ts b/packages/cultmesh-ts/test/cultmesh.test.ts index 77bd635c..3954c697 100644 --- a/packages/cultmesh-ts/test/cultmesh.test.ts +++ b/packages/cultmesh-ts/test/cultmesh.test.ts @@ -2500,11 +2500,15 @@ test("CultMesh TS branded facade exposes schema and shard catalogs", () => { const builtIns = CultMesh.createBuiltInSchemaCatalog(); assert.equal( - builtIns.get("cultnet.shard_catalog_request.v0")?.schemaVersion, + builtIns.get( + "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.shard-catalog-request.schema.json", + )?.schemaVersion, "cultnet.shard_catalog_request.v0", ); assert.equal( - builtIns.get("cultnet.shard_catalog_response.v0")?.kind, + builtIns.get( + "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.shard-catalog-response.schema.json", + )?.kind, "wire_message", ); assert.equal( diff --git a/packages/cultnet-ts/package.json b/packages/cultnet-ts/package.json index 82baeba0..0b101282 100644 --- a/packages/cultnet-ts/package.json +++ b/packages/cultnet-ts/package.json @@ -23,8 +23,8 @@ "contracts:generate": "node tools/generate-swarm-contracts.mjs", "build": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json", "typecheck": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json --pretty false", - "test": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test dist-test/test/*.test.js", - "test:interop": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test --test-force-exit dist-test/test/interop/*.test.js" + "test": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test dist-test/packages/cultnet-ts/test/*.test.js", + "test:interop": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test --test-force-exit dist-test/packages/cultnet-ts/test/interop/*.test.js" }, "keywords": [ "messagepack", diff --git a/packages/cultnet-ts/test/interop/cultnet-interop.test.ts b/packages/cultnet-ts/test/interop/cultnet-interop.test.ts index 51bea1ff..07fb268b 100644 --- a/packages/cultnet-ts/test/interop/cultnet-interop.test.ts +++ b/packages/cultnet-ts/test/interop/cultnet-interop.test.ts @@ -21,7 +21,7 @@ const execFileAsync = promisify(execFile); const cargoCommand = process.env.CARGO ?? (process.platform === "win32" ? join(homedir(), ".cargo", "bin", "cargo.exe") : "cargo"); const dotnetCommand = process.env.DOTNET ?? (process.platform === "win32" ? join("C:", "Program Files", "dotnet", "dotnet.exe") : "dotnet"); const pythonCommand = process.env.PYTHON ?? resolvePythonCommand(); -const cultNetTsRoot = resolve(__dirname, "../../.."); +const cultNetTsRoot = resolve(__dirname, "../../../../.."); const cultLibRoot = findAncestor(cultNetTsRoot, "CultLib.sln") ?? resolve(cultNetTsRoot, "..", "CultLib"); const cultcachePyRoot = resolve(cultLibRoot, "packages", "cultcache-py"); const cultcachePySrc = ["cultcache-py", "cultnet-py", "cultmesh-py"] diff --git a/packages/cultnet-ts/test/runtime-presence-health.test.ts b/packages/cultnet-ts/test/runtime-presence-health.test.ts index fa21aeaa..2ceedde3 100644 --- a/packages/cultnet-ts/test/runtime-presence-health.test.ts +++ b/packages/cultnet-ts/test/runtime-presence-health.test.ts @@ -26,7 +26,7 @@ import { // are generated output and must have exactly one home. const VECTORS = JSON.parse( readFileSync( - join(__dirname, "..", "..", "test", "fixtures", "runtime-presence-vectors.json"), + join(__dirname, "..", "..", "..", "..", "test", "fixtures", "runtime-presence-vectors.json"), "utf8", ), ) as { proof: string; signed: string }; diff --git a/packages/cultnet-ts/tsconfig.test.json b/packages/cultnet-ts/tsconfig.test.json index a73b52c0..fc47617c 100644 --- a/packages/cultnet-ts/tsconfig.test.json +++ b/packages/cultnet-ts/tsconfig.test.json @@ -1,7 +1,7 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "rootDir": ".", + "rootDir": "../..", "outDir": "dist-test", "declaration": false, "declarationMap": false From 59aca27b673086e65b9c68a52193a357694626e0 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 13 Sep 2026 17:45:53 +0200 Subject: [PATCH 03/94] Add CI drift guard for the CultNet contracts consolidation REC-032 commit 2: fail cultnet-interop.yml before it installs Node dependencies if either negative check from commit 1 finds anything: a *.schema.json file living outside contracts/cultnet/, or a lingering reference to the retired https://github.com/GameCult/cultnet-ts/contracts (or .../integration/contracts) namespace anywhere but .voidbot/birth snapshots. The old-namespace grep uses git grep -I so the deferred Unity plugin DLL (D4, not rebuilt in this pass) doesn't trip a permanent false failure. Verified locally: staging a stray contracts/stray.schema.json and a stray-id.ts referencing the old namespace makes the guard's logic report failure for both; removing them makes it pass again against the real tree. REC-032. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/cultnet-interop.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.github/workflows/cultnet-interop.yml b/.github/workflows/cultnet-interop.yml index 6876a76a..4000cc1c 100644 --- a/.github/workflows/cultnet-interop.yml +++ b/.github/workflows/cultnet-interop.yml @@ -65,6 +65,29 @@ jobs: "KOTLIN_JAVA_HOME=$env:JAVA_HOME" | Out-File -FilePath $env:GITHUB_ENV -Append "$kotlinHome\bin" | Out-File -FilePath $env:GITHUB_PATH -Append + - name: Verify CultNet schema contracts stayed consolidated + shell: pwsh + run: | + $ErrorActionPreference = "Stop" + $stray = git ls-files '*.schema.json' | Where-Object { $_ -notmatch '^contracts/cultnet/' } + # -I skips binary files: unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.dll + # still embeds the retired namespace until it is rebuilt (REC-032 D4, deferred). + $oldNamespace = git grep -I -lE 'GameCult/cultnet-ts/(integration/)?contracts' -- ':!.voidbot' + if ($LASTEXITCODE -eq 2) { + throw "git grep failed" + } + if ($stray) { + Write-Host "Schema files found outside contracts/cultnet/:" + $stray | ForEach-Object { Write-Host " $_" } + } + if ($oldNamespace) { + Write-Host "Files still referencing the retired GameCult/cultnet-ts contracts namespace:" + $oldNamespace | ForEach-Object { Write-Host " $_" } + } + if ($stray -or $oldNamespace) { + throw "CultNet schema contracts drifted out of contracts/cultnet/ (REC-032). See CultLib/contracts/cultnet/ and rewrite any `$id back to https://github.com/GameCult/CultLib/contracts/cultnet/." + } + - name: Install Node dependencies run: npm install --no-package-lock From 7d3a3dc42c9c2f71e0afd73d1cf3853c178ff035 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 13 Sep 2026 17:52:15 +0200 Subject: [PATCH 04/94] Let the CultNet contract drift guard pass on a clean tree git grep exits 1 when it finds nothing, and the GitHub pwsh step wrapper ends the step with that $LASTEXITCODE, so the guard failed on exactly the clean tree it should accept. End the step with an explicit exit 0 after the checks; a real drift still throws first. REC-032. Co-Authored-By: Claude Opus 5 --- .github/workflows/cultnet-interop.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/cultnet-interop.yml b/.github/workflows/cultnet-interop.yml index 4000cc1c..5f8936bf 100644 --- a/.github/workflows/cultnet-interop.yml +++ b/.github/workflows/cultnet-interop.yml @@ -87,6 +87,9 @@ jobs: if ($stray -or $oldNamespace) { throw "CultNet schema contracts drifted out of contracts/cultnet/ (REC-032). See CultLib/contracts/cultnet/ and rewrite any `$id back to https://github.com/GameCult/CultLib/contracts/cultnet/." } + # git grep exits 1 when nothing matches, and the runner's pwsh wrapper + # ends the step with that $LASTEXITCODE; a clean tree must pass. + exit 0 - name: Install Node dependencies run: npm install --no-package-lock From 61549aa90bf1937a2bd4fc7d9d190d74d366f69e Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 13 Sep 2026 18:03:29 +0200 Subject: [PATCH 05/94] Make cultnet-ts a self-contained package again; revert fa00f3f's rootDir widen REC-032 Soul finding: dist/contracts.js required "../../../contracts/cultnet/...", escaping the cultnet-ts package tree entirely. That breaks every installed consumer: the two-runtime sample script (packs and installs cultnet-ts into a clean consumer), test-typescript-package-closure.mjs, and Heimdall's pnpm copy of cultnet-ts (honours `files`, would 404 on its next vendor/CultLib bump). Only Stonks (file: symlink into the live checkout) happened to still work. Fix: keep CultLib/contracts/cultnet as the only tracked source, but have tools/generate-swarm-contracts.mjs wipe and re-copy it into a package-local, gitignored packages/cultnet-ts/contracts/cultnet/ every time it runs (build, typecheck, test, test:interop, prepack, the two-runtime script, and Heimdral's `npm run build` all already invoke it). src/contracts.ts and the swarm-contracts manifest now import that package-local copy ("../contracts/cultnet/...") instead of reaching three directories up. package.json gets back `files: ["dist", "contracts"]` and `prepack` so a packed tarball carries its own schema copy. Also revert fa00f3f's tsconfig.test.json rootDir widen ("." -> "../..") and the matching test-script/dist-test path changes and __dirname-relative recomputation in cultnet-interop.test.ts and runtime-presence-health.test.ts: that widening was working around dist-test not receiving a copy of the (now out-of-package) contracts, but nothing in this repo actually needs the wider rootDir once the schemas are package-local again, and the widened paths never matched what CI's interop lanes and package.json's own dist-test paths expect -- packages/cultnet-ts/dist-test/test/interop/cultnet-interop.test.js, not .../dist-test/packages/cultnet-ts/test/interop/.... PR #3 CI run 34766892424 on 7d3a3dc failed the first interop lane on exactly this missing-file defect. cultnet-interop.test.ts's interopSchemaPath already resolved correctly once cultNetTsRoot was reverted (it was never touched by fa00f3f) and continues to point at the canonical CultLib/contracts/cultnet/interop copy, which is fine since it is only read by the spawned non-TS peer processes, not required() by this package. The cultmesh-ts shard-catalog $id lookup fix from fa00f3f (cultnet.shard_catalog_request.v0 -> the CultLib contracts URL id) is unrelated to the rootDir defect and is left as is. REC-032, Soul redirect on branch claude/rec-032-cultnet-contracts. Co-Authored-By: Claude Sonnet 5 --- packages/cultnet-ts/.gitignore | 3 + packages/cultnet-ts/package.json | 8 ++- packages/cultnet-ts/src/contracts.ts | 66 +++++++++---------- .../generated/swarm-contracts.generated.ts | 2 +- .../test/interop/cultnet-interop.test.ts | 2 +- .../test/runtime-presence-health.test.ts | 2 +- .../tools/generate-swarm-contracts.mjs | 22 +++++-- .../tools/swarm-contracts.manifest.json | 2 +- packages/cultnet-ts/tsconfig.test.json | 2 +- 9 files changed, 64 insertions(+), 45 deletions(-) diff --git a/packages/cultnet-ts/.gitignore b/packages/cultnet-ts/.gitignore index fd3ec924..fd7098ff 100644 --- a/packages/cultnet-ts/.gitignore +++ b/packages/cultnet-ts/.gitignore @@ -2,3 +2,6 @@ node_modules/ dist/ dist-test/ *.tgz +# Mirrored from CultLib/contracts/cultnet by tools/generate-swarm-contracts.mjs +# (REC-032). Not tracked: CultLib/contracts/cultnet is the only source. +contracts/ diff --git a/packages/cultnet-ts/package.json b/packages/cultnet-ts/package.json index 0b101282..f94f0bfa 100644 --- a/packages/cultnet-ts/package.json +++ b/packages/cultnet-ts/package.json @@ -17,14 +17,16 @@ } }, "files": [ - "dist" + "dist", + "contracts" ], "scripts": { "contracts:generate": "node tools/generate-swarm-contracts.mjs", "build": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json", + "prepack": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json", "typecheck": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json --pretty false", - "test": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test dist-test/packages/cultnet-ts/test/*.test.js", - "test:interop": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test --test-force-exit dist-test/packages/cultnet-ts/test/interop/*.test.js" + "test": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test dist-test/test/*.test.js", + "test:interop": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test --test-force-exit dist-test/test/interop/*.test.js" }, "keywords": [ "messagepack", diff --git a/packages/cultnet-ts/src/contracts.ts b/packages/cultnet-ts/src/contracts.ts index d44f391f..d90af381 100644 --- a/packages/cultnet-ts/src/contracts.ts +++ b/packages/cultnet-ts/src/contracts.ts @@ -1,38 +1,38 @@ import Ajv2020, { type ValidateFunction } from "ajv/dist/2020"; -import documentRecordSchema from "../../../contracts/cultnet/cultnet.document-record.schema.json"; -import helloSchema from "../../../contracts/cultnet/cultnet.hello.schema.json"; -import loginSchema from "../../../contracts/cultnet/cultnet.login.schema.json"; -import registerSchema from "../../../contracts/cultnet/cultnet.register.schema.json"; -import verifySchema from "../../../contracts/cultnet/cultnet.verify.schema.json"; -import loginSuccessSchema from "../../../contracts/cultnet/cultnet.login-success.schema.json"; -import errorSchema from "../../../contracts/cultnet/cultnet.error.schema.json"; -import sampleChangeNameSchema from "../../../contracts/cultnet/cultnet.sample-change-name.schema.json"; -import sampleChatSchema from "../../../contracts/cultnet/cultnet.sample-chat.schema.json"; -import documentPutSchema from "../../../contracts/cultnet/cultnet.document-put.schema.json"; -import documentDeleteSchema from "../../../contracts/cultnet/cultnet.document-delete.schema.json"; -import rawDocumentRecordSchema from "../../../contracts/cultnet/cultnet.raw-document-record.schema.json"; -import documentPutRawSchema from "../../../contracts/cultnet/cultnet.document-put-raw.schema.json"; -import documentMutationContractSchema from "../../../contracts/cultnet/cultnet.document-mutation-contract.schema.json"; -import transportProfileSchema from "../../../contracts/cultnet/cultnet.transport-profile.schema.json"; -import snapshotRequestSchema from "../../../contracts/cultnet/cultnet.snapshot-request.schema.json"; -import snapshotResponseSchema from "../../../contracts/cultnet/cultnet.snapshot-response.schema.json"; -import snapshotResponseRawSchema from "../../../contracts/cultnet/cultnet.snapshot-response-raw.schema.json"; -import databaseSubscribeSchema from "../../../contracts/cultnet/cultnet.database-subscribe.schema.json"; -import databaseUnsubscribeSchema from "../../../contracts/cultnet/cultnet.database-unsubscribe.schema.json"; -import databaseChangeRawSchema from "../../../contracts/cultnet/cultnet.database-change-raw.schema.json"; -import schemaDescriptorSchema from "../../../contracts/cultnet/cultnet.schema-descriptor.schema.json"; -import schemaCatalogRequestSchema from "../../../contracts/cultnet/cultnet.schema-catalog-request.schema.json"; -import schemaCatalogResponseSchema from "../../../contracts/cultnet/cultnet.schema-catalog-response.schema.json"; -import shardCatalogRequestSchema from "../../../contracts/cultnet/cultnet.shard-catalog-request.schema.json"; -import shardCatalogResponseSchema from "../../../contracts/cultnet/cultnet.shard-catalog-response.schema.json"; -import operationRequestSchema from "../../../contracts/cultnet/cultnet.operation-request.schema.json"; -import operationResponseSchema from "../../../contracts/cultnet/cultnet.operation-response.schema.json"; -import verseCatalogRequestSchema from "../../../contracts/cultnet/cultmesh.verse-catalog-request.schema.json"; -import verseCatalogResponseSchema from "../../../contracts/cultnet/cultmesh.verse-catalog-response.schema.json"; -import sessionOpenSchema from "../../../contracts/cultnet/cultmesh.session-open.schema.json"; -import sessionAcceptedSchema from "../../../contracts/cultnet/cultmesh.session-accepted.schema.json"; -import ghostlightAgentStateSchema from "../../../contracts/cultnet/ghostlight.agent-state.schema.json"; +import documentRecordSchema from "../contracts/cultnet/cultnet.document-record.schema.json"; +import helloSchema from "../contracts/cultnet/cultnet.hello.schema.json"; +import loginSchema from "../contracts/cultnet/cultnet.login.schema.json"; +import registerSchema from "../contracts/cultnet/cultnet.register.schema.json"; +import verifySchema from "../contracts/cultnet/cultnet.verify.schema.json"; +import loginSuccessSchema from "../contracts/cultnet/cultnet.login-success.schema.json"; +import errorSchema from "../contracts/cultnet/cultnet.error.schema.json"; +import sampleChangeNameSchema from "../contracts/cultnet/cultnet.sample-change-name.schema.json"; +import sampleChatSchema from "../contracts/cultnet/cultnet.sample-chat.schema.json"; +import documentPutSchema from "../contracts/cultnet/cultnet.document-put.schema.json"; +import documentDeleteSchema from "../contracts/cultnet/cultnet.document-delete.schema.json"; +import rawDocumentRecordSchema from "../contracts/cultnet/cultnet.raw-document-record.schema.json"; +import documentPutRawSchema from "../contracts/cultnet/cultnet.document-put-raw.schema.json"; +import documentMutationContractSchema from "../contracts/cultnet/cultnet.document-mutation-contract.schema.json"; +import transportProfileSchema from "../contracts/cultnet/cultnet.transport-profile.schema.json"; +import snapshotRequestSchema from "../contracts/cultnet/cultnet.snapshot-request.schema.json"; +import snapshotResponseSchema from "../contracts/cultnet/cultnet.snapshot-response.schema.json"; +import snapshotResponseRawSchema from "../contracts/cultnet/cultnet.snapshot-response-raw.schema.json"; +import databaseSubscribeSchema from "../contracts/cultnet/cultnet.database-subscribe.schema.json"; +import databaseUnsubscribeSchema from "../contracts/cultnet/cultnet.database-unsubscribe.schema.json"; +import databaseChangeRawSchema from "../contracts/cultnet/cultnet.database-change-raw.schema.json"; +import schemaDescriptorSchema from "../contracts/cultnet/cultnet.schema-descriptor.schema.json"; +import schemaCatalogRequestSchema from "../contracts/cultnet/cultnet.schema-catalog-request.schema.json"; +import schemaCatalogResponseSchema from "../contracts/cultnet/cultnet.schema-catalog-response.schema.json"; +import shardCatalogRequestSchema from "../contracts/cultnet/cultnet.shard-catalog-request.schema.json"; +import shardCatalogResponseSchema from "../contracts/cultnet/cultnet.shard-catalog-response.schema.json"; +import operationRequestSchema from "../contracts/cultnet/cultnet.operation-request.schema.json"; +import operationResponseSchema from "../contracts/cultnet/cultnet.operation-response.schema.json"; +import verseCatalogRequestSchema from "../contracts/cultnet/cultmesh.verse-catalog-request.schema.json"; +import verseCatalogResponseSchema from "../contracts/cultnet/cultmesh.verse-catalog-response.schema.json"; +import sessionOpenSchema from "../contracts/cultnet/cultmesh.session-open.schema.json"; +import sessionAcceptedSchema from "../contracts/cultnet/cultmesh.session-accepted.schema.json"; +import ghostlightAgentStateSchema from "../contracts/cultnet/ghostlight.agent-state.schema.json"; export type CultNetWireContract = "cultnet.schema.v0" | "gamecult.networking.v0"; diff --git a/packages/cultnet-ts/src/generated/swarm-contracts.generated.ts b/packages/cultnet-ts/src/generated/swarm-contracts.generated.ts index 84bb09b0..f2dffce2 100644 --- a/packages/cultnet-ts/src/generated/swarm-contracts.generated.ts +++ b/packages/cultnet-ts/src/generated/swarm-contracts.generated.ts @@ -1,5 +1,5 @@ import { defineJsonSchemaContract } from "../json-schema-contract"; -import ghostlightAgentStateGeneratedContractSchema from "../../../../contracts/cultnet/ghostlight.agent-state.schema.json"; +import ghostlightAgentStateGeneratedContractSchema from "../../contracts/cultnet/ghostlight.agent-state.schema.json"; // Generated by tools/generate-swarm-contracts.mjs. Do not hand-edit this file unless you enjoy losing arguments with a machine. diff --git a/packages/cultnet-ts/test/interop/cultnet-interop.test.ts b/packages/cultnet-ts/test/interop/cultnet-interop.test.ts index 07fb268b..51bea1ff 100644 --- a/packages/cultnet-ts/test/interop/cultnet-interop.test.ts +++ b/packages/cultnet-ts/test/interop/cultnet-interop.test.ts @@ -21,7 +21,7 @@ const execFileAsync = promisify(execFile); const cargoCommand = process.env.CARGO ?? (process.platform === "win32" ? join(homedir(), ".cargo", "bin", "cargo.exe") : "cargo"); const dotnetCommand = process.env.DOTNET ?? (process.platform === "win32" ? join("C:", "Program Files", "dotnet", "dotnet.exe") : "dotnet"); const pythonCommand = process.env.PYTHON ?? resolvePythonCommand(); -const cultNetTsRoot = resolve(__dirname, "../../../../.."); +const cultNetTsRoot = resolve(__dirname, "../../.."); const cultLibRoot = findAncestor(cultNetTsRoot, "CultLib.sln") ?? resolve(cultNetTsRoot, "..", "CultLib"); const cultcachePyRoot = resolve(cultLibRoot, "packages", "cultcache-py"); const cultcachePySrc = ["cultcache-py", "cultnet-py", "cultmesh-py"] diff --git a/packages/cultnet-ts/test/runtime-presence-health.test.ts b/packages/cultnet-ts/test/runtime-presence-health.test.ts index 2ceedde3..fa21aeaa 100644 --- a/packages/cultnet-ts/test/runtime-presence-health.test.ts +++ b/packages/cultnet-ts/test/runtime-presence-health.test.ts @@ -26,7 +26,7 @@ import { // are generated output and must have exactly one home. const VECTORS = JSON.parse( readFileSync( - join(__dirname, "..", "..", "..", "..", "test", "fixtures", "runtime-presence-vectors.json"), + join(__dirname, "..", "..", "test", "fixtures", "runtime-presence-vectors.json"), "utf8", ), ) as { proof: string; signed: string }; diff --git a/packages/cultnet-ts/tools/generate-swarm-contracts.mjs b/packages/cultnet-ts/tools/generate-swarm-contracts.mjs index 53ad1e18..dd27ad7c 100644 --- a/packages/cultnet-ts/tools/generate-swarm-contracts.mjs +++ b/packages/cultnet-ts/tools/generate-swarm-contracts.mjs @@ -1,4 +1,4 @@ -import { mkdir, readFile, writeFile } from "node:fs/promises"; +import { cp, mkdir, readFile, rm, writeFile } from "node:fs/promises"; import path from "node:path"; import { fileURLToPath } from "node:url"; @@ -6,9 +6,23 @@ import { compile } from "json-schema-to-typescript"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); -const repoRoot = path.resolve(__dirname, ".."); -const manifestPath = path.join(repoRoot, "tools", "swarm-contracts.manifest.json"); -const outputPath = path.join(repoRoot, "src", "generated", "swarm-contracts.generated.ts"); +const packageRoot = path.resolve(__dirname, ".."); +const cultLibRoot = path.resolve(packageRoot, "..", ".."); +const manifestPath = path.join(packageRoot, "tools", "swarm-contracts.manifest.json"); +const outputPath = path.join(packageRoot, "src", "generated", "swarm-contracts.generated.ts"); + +// CultLib/contracts/cultnet is the single source of CultNet schema contracts +// (REC-032). cultnet-ts is a standalone npm package (published or vendored by +// Heimdall independent of the CultLib checkout), so it cannot import schemas +// that live outside its own package tree. Mirror the canonical contracts into +// a package-local, gitignored copy every time this generator runs, so `dist` +// and `contracts` both ship self-contained. Wipe first: a stale local file +// left behind after a schema is deleted upstream must not survive as drift. +const sourceContractsDir = path.join(cultLibRoot, "contracts", "cultnet"); +const localContractsDir = path.join(packageRoot, "contracts", "cultnet"); +await rm(localContractsDir, { recursive: true, force: true }); +await mkdir(path.dirname(localContractsDir), { recursive: true }); +await cp(sourceContractsDir, localContractsDir, { recursive: true }); /** * @typedef {{ diff --git a/packages/cultnet-ts/tools/swarm-contracts.manifest.json b/packages/cultnet-ts/tools/swarm-contracts.manifest.json index 49b5073d..f5750740 100644 --- a/packages/cultnet-ts/tools/swarm-contracts.manifest.json +++ b/packages/cultnet-ts/tools/swarm-contracts.manifest.json @@ -1,7 +1,7 @@ { "contracts": [ { - "schemaPath": "../../../contracts/cultnet/ghostlight.agent-state.schema.json", + "schemaPath": "../contracts/cultnet/ghostlight.agent-state.schema.json", "typeName": "GhostlightAgentStateShape", "contractExportName": "ghostlightAgentStateGeneratedContract", "validateExportName": "validateGhostlightAgentStateGenerated", diff --git a/packages/cultnet-ts/tsconfig.test.json b/packages/cultnet-ts/tsconfig.test.json index fc47617c..a73b52c0 100644 --- a/packages/cultnet-ts/tsconfig.test.json +++ b/packages/cultnet-ts/tsconfig.test.json @@ -1,7 +1,7 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "rootDir": "../..", + "rootDir": ".", "outDir": "dist-test", "declaration": false, "declarationMap": false From ae194d5eb276f35194d2042451e228c640b3527b Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 14 Sep 2026 15:18:42 +0200 Subject: [PATCH 06/94] Release CultLib Unity 1.0.57 with deterministic plugin assemblies Bumps org.gamecult.cultlib to 1.0.57 and rebuilds its managed plugins from main, so the Unity package carries the store-routing CultCache (one home store per type, AddBackingStore(CacheBackingStore, Type[]), atomic commit) instead of the Sep 3 assemblies. Install docs point at the new tag. The build script now publishes without Source Link or the source revision, with CI path mapping and cleared Release intermediates. The previous DLLs named the commit and the worktree they were built in, so committed plugins could never match a fresh build of the commit that holds them. Co-Authored-By: Claude Opus 5 --- docs/nuget-packaging.md | 2 +- scripts/build-unity-package.ps1 | 18 +++++++++++++++--- unity/org.gamecult.cultlib/README.md | 4 ++-- .../Plugins/GameCult.Caching.MessagePack.dll | Bin 51200 -> 41472 bytes .../Plugins/GameCult.Caching.MessagePack.pdb | Bin 22020 -> 18920 bytes .../Runtime/Plugins/GameCult.Caching.dll | Bin 96256 -> 118784 bytes .../Runtime/Plugins/GameCult.Caching.pdb | Bin 32964 -> 37948 bytes .../Runtime/Plugins/GameCult.Logging.dll | Bin 6656 -> 6656 bytes .../Runtime/Plugins/GameCult.Logging.pdb | Bin 9520 -> 9256 bytes .../Plugins/GameCult.Mesh.Quic.Native.dll | Bin 15872 -> 15872 bytes .../Plugins/GameCult.Mesh.Quic.Native.pdb | Bin 12292 -> 11960 bytes .../Runtime/Plugins/GameCult.Mesh.dll | Bin 700416 -> 675840 bytes .../Runtime/Plugins/GameCult.Mesh.pdb | Bin 207028 -> 160904 bytes .../GameCult.Networking.WebSockets.dll | Bin 14848 -> 14848 bytes .../Runtime/Plugins/GameCult.Networking.dll | Bin 525312 -> 524288 bytes .../Runtime/Plugins/GameCult.Networking.pdb | Bin 250308 -> 247280 bytes .../x86_64/gamecult_mesh_quic_native.dll | Bin 40448 -> 40448 bytes unity/org.gamecult.cultlib/package.json | 2 +- 18 files changed, 19 insertions(+), 7 deletions(-) diff --git a/docs/nuget-packaging.md b/docs/nuget-packaging.md index afc94570..986f73df 100644 --- a/docs/nuget-packaging.md +++ b/docs/nuget-packaging.md @@ -19,5 +19,5 @@ closure through UPM rather than NuGet restore. Install the Unity package from the immutable release tag: ```text -https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.46 +https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.57 ``` diff --git a/scripts/build-unity-package.ps1 b/scripts/build-unity-package.ps1 index 804f78df..8e425066 100644 --- a/scripts/build-unity-package.ps1 +++ b/scripts/build-unity-package.ps1 @@ -38,7 +38,19 @@ if (Test-Path -LiteralPath $outputRoot) { } $unityPackageVersion = (Get-Content -LiteralPath (Join-Path $templateRoot "package.json") -Raw | ConvertFrom-Json).version -$publishArguments = @("publish", $projectPath, "-c", $Configuration, "-o", $publishRoot, "-p:CultLibPackageVersion=$unityPackageVersion") +# The tracked DLLs and pdbs are committed beside their source, so none may name a commit or a worktree: +# Source Link writes the commit SHA into the pdb, the informational version carries it too, and each DLL +# carries its pdb's content id. ContinuousIntegrationBuild maps the local source path to /_/. +# dotnet publish has no --no-incremental, so clear the configuration's intermediates instead: a stale obj +# directory must not decide what the byte check compares. +Get-ChildItem -LiteralPath (Join-Path $repoRoot "obj\src") -Directory -ErrorAction SilentlyContinue | + ForEach-Object { Join-Path $_.FullName $Configuration } | + Where-Object { Test-Path -LiteralPath $_ } | + ForEach-Object { Remove-Item -LiteralPath $_ -Recurse -Force } +$deterministicArguments = @("--disable-build-servers", "-p:UseSharedCompilation=false", + "-p:ContinuousIntegrationBuild=true", "-p:EnableSourceLink=false", + "-p:IncludeSourceRevisionInInformationalVersion=false", "-m:1") +$publishArguments = @("publish", $projectPath, "-c", $Configuration, "-o", $publishRoot, "-p:CultLibPackageVersion=$unityPackageVersion") + $deterministicArguments if ($NoRestore) { $publishArguments += "--no-restore" } if (-not [string]::IsNullOrWhiteSpace($NuGetConfig)) { $publishArguments += "-p:RestoreConfigFile=$([IO.Path]::GetFullPath($NuGetConfig))" @@ -47,7 +59,7 @@ if (-not [string]::IsNullOrWhiteSpace($NuGetConfig)) { if ($LASTEXITCODE -ne 0) { throw "CultLib publish failed with exit code $LASTEXITCODE" } -$webSocketPublishArguments = @("publish", $webSocketProjectPath, "-c", $Configuration, "-f", "netstandard2.1", "-o", $webSocketPublishRoot, "-p:CultLibPackageVersion=$unityPackageVersion") +$webSocketPublishArguments = @("publish", $webSocketProjectPath, "-c", $Configuration, "-f", "netstandard2.1", "-o", $webSocketPublishRoot, "-p:CultLibPackageVersion=$unityPackageVersion") + $deterministicArguments if ($NoRestore) { $webSocketPublishArguments += "--no-restore" } if (-not [string]::IsNullOrWhiteSpace($NuGetConfig)) { $webSocketPublishArguments += "-p:RestoreConfigFile=$([IO.Path]::GetFullPath($NuGetConfig))" @@ -56,7 +68,7 @@ if (-not [string]::IsNullOrWhiteSpace($NuGetConfig)) { if ($LASTEXITCODE -ne 0) { throw "CultLib WebSocket publish failed with exit code $LASTEXITCODE" } -$quicPublishArguments = @("publish", $quicProjectPath, "-c", $Configuration, "-o", $quicPublishRoot, "-p:CultLibPackageVersion=$unityPackageVersion") +$quicPublishArguments = @("publish", $quicProjectPath, "-c", $Configuration, "-o", $quicPublishRoot, "-p:CultLibPackageVersion=$unityPackageVersion") + $deterministicArguments if ($NoRestore) { $quicPublishArguments += "--no-restore" } if (-not [string]::IsNullOrWhiteSpace($NuGetConfig)) { $quicPublishArguments += "-p:RestoreConfigFile=$([IO.Path]::GetFullPath($NuGetConfig))" diff --git a/unity/org.gamecult.cultlib/README.md b/unity/org.gamecult.cultlib/README.md index 8aeaf53e..3c88d34b 100644 --- a/unity/org.gamecult.cultlib/README.md +++ b/unity/org.gamecult.cultlib/README.md @@ -9,10 +9,10 @@ runtime; the Microsoft license is included under `Third Party Notices`. Build it with `scripts/build-unity-package.ps1`. Do not edit generated plugin assemblies in the package output. -Install version `1.0.41` through Unity Package Manager with: +Install version `1.0.57` through Unity Package Manager with: ```text -https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.41 +https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.57 ``` CultMesh chooses mapped memory for reachable same-machine bodies and advertised diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.dll index 4cc546154fb0b42b9bfcd22d2bf44ff128fbe5fa..e4c51fc6bd2f45f6872da2bf321617dc22e4e3e0 100644 GIT binary patch literal 41472 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 literal 51200 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𝔦tS_DG5NtBLK8zNQQp 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 OH_2T8>gWGE4*V~+TWi4p literal 96256 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 )h1SMoMOzS;-w(1iIhvKLTQ*4 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 PtLw{qzh7N+clQ4PxOD*v literal 32964 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 delta 743 zcmXw%Pe>GT6vy9hcFGJ}_fJX(5&r}p%<;FoGvlmAZm0#JBo#L;`0Cl*YQUI=rR_TnmPCCd3Q9{j#3K=6S zf=J;bJ6J?SDcIwTO0Nl7c7FPTGI=8Y)|`K|K@_mS)fw0(15kh(X#kF+4nYX!Fy|7> zBNjY_I*EIH!Q%@aUqBv{Rz0%nkyRw)(iXHq3Dteit{3lmv5&aC-PHg-+_YT8BjTqR z&gWzMa$ql4y0hk=A6&Wl`1H~K?27aCM3ES}LIG3)-4TT#&t{AG{)mJ!bGZmC%S$A#Y-R~qY`#mM6cq|ssRiR%KC|9_?-RXl*@a$nG@qO1mR&FhW;6D1dZLSQdy41Ntc%UsQ@MQF zo-=b3(`F%WnHSk@?v^RTxl}5hO_^7ChO+`Uv)nG&ESqHcWK@Zm;zytDupk_OAPNQ&19~t^fx{$d uSmiPm3G=FTtk#ihxaPQz;yxz6HE7tTzVQvIZTbJdR{Ndcso$hbYyJWIv$DSc diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Logging.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Logging.pdb index 93e24784ab7fbb57088c4efcdca0fb76d1baf224..f0189156aaa9fb8b947625c53e2bb56c741309c9 100644 GIT binary patch delta 870 zcmdnswZdb9Nz4OA1_tFi28K0E3=Av`Kz49RQD$CxF_6iy0VWn2%&-N>P5{ZfhkCjI zX%S{1Rs`~$a`Kaae1WO!d_Vq-@!VtRb2U9ylKa>FrqvTCq-e7O84MVh7~+9+ z8jzj@q-OzXHbzDU5k@A4A3&OoiD|MTqp&XnP%ch^k)Z&H+kkkE0?+`U+O-Ny4CjIP zHV{7o;+H`D0W1fShXH1W?+VNe|A3fPk(q&Kay{c~ha8|v1_q#WfhM0&0J(<^%w}NV z0MeX5tj@s7aD`bND6Yje4XDzTaT}0SXJTe#VYtLRc@vY@WFBTkCdT;5AX?7+!8nRPhW!Qu_=lixAt@bLmU4ZE4y8}>IGZ@4x&ljTW0vQXo71?8u& z-s@WF2mW(gv3GHBaMQ*JyGF5SPxJr5YC*3~7q~XAHxec*Alr zDQnv)PC{HSr?ogSsm{*hU)sLWW*WOn??gA=x+VME=C3(%TkqaKM)5Fn&-;J&UF=!1 z%g*|hh3(4h9f#`I6s2hfxGep4c1y&uwfaZwJdd|#JyFxP zjjjwb5uAGV)z9fir(D>0R@LiJ&sT>&gNy$g+6*_nEoJ-pkN2IY;5LyUtXIwt0JG-r8a+mpS^u%U911Z usn;%D@^yKwsUgv>8LIk@osoI-2liPqObb#c_ozg%E=Xluuy68f6;}X!Ry<(< delta 1137 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 delta 1426 zcmZ{kX;4#F6vyw&#$t?8Nm&aRgn$Hs0YVa~7*O7Q&i|bA-v4}fckZd2 zuk&gm#jYd({7V6FBm#e1qKQpy+iG@rO@T8tK!6?)z+IT1!90W@U<@JPLS)8D z0DHth1UN%nAnp)fh!rvb`3>?%AT)vRJ%&1&iGcNxgODajE95lOKDR#zxB%-(2sOxV zPlp{&&_9!#A97K!wGX*YAk+uqjU>N$P9!FvfJPV{zbe{2g6_%=86^hC*g-okNLs31Z&}fxdAyKE5c;KZD9yp!CbaW6Sq^UuyBs`v? znntr1rd>fS(_Yg-Qw!cfd2IYougvPls&syN(D(H(`T3-7Jc=o zwqHs}EqhZ0f86nm!PSHFr#Bj z3$HR?MNi6PzxNNck?Ciq5tP0AbXb1vEPm{W2W>mac%s>*_>1i`H^u!q_(a0nN-q|1 znFissxj-7~_s#bL+SSiCtT+(dQ@*@Lw4yn%v4vc*g_(EAqB~6DG(FpMoEXVJ)7)R< zq8KHg8fZyL%vQf1Rxt0RbY{MA>%CN+&r`(Ied4o{ossKv_Tof_Vo7Jem||Nt{@qAw zyPJ`4&p4X9eo?mOYTGSFwKd5$t0_gqcg?!?sQnJhJlyJ(**~^+2oD?|k4>oSU%R5m zr)TTaW`=M%{yfLHBWiHb=mz7+#Dkspe>u>F+x(qlXIS1n+(>76g@(MK^Ws9qn>KpI zFSL|*3Je^UTHd)Zkw)F@7Rm4M7E9t1N%AhC(S3LKrE5w}akNF5_Ny<2S9!xAsJij~ zT%p`~bmW9f<6nseuGd2=HYdHR$M!0w{+!2=jMSHf0uMAJ1Nd!&?rAg20a zhEyZbt7Qe4jv**!BniagkH=Ch{{M3+7SCn~7zzwqqZ6>%T6BGwT!|?}`c- z9F#qqQBq<(>Xbzw>?h&~bx}@!NM{2WMnEckbZ75a^@5$fo%Hm2!|RVL!s1bh0$xsG zX)>J-mCHn^Xr&2tITf=gu?2Pi zu7_(CAGW+WZr%a>rU380%1qhWzGRE{JIbv#YYsk1^>i15i4ll mPv3AK$*ruZY# x8_S<`~4BjhN+#*?^e0S~Vdl#J>SSUk=*< diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.dll index a37e9873dc4a42e67f706ee310f277f2c03401b8..124537423c740810cfae333a05756187168d11fa 100644 GIT binary patch literal 675840 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 z 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

leuDbgWD*Vjxu3rGj~-sz%=^-mpK z2NW5?BxednP>>&-WlT~K!$}~UoOX3}R38GNv^G1Vm{5H^c@L2(O!^~MT0CO$iyo0-r^LgU5`r!bRFXk(g` zVDjN8Jww~!l-ES1-p(hh<%(o`roQ$#-!d^XqCL(QCZ-1WID46x8r8gbW|yZxsabdPHrX?!-|R&i6N&jm)PUfP(;rPdLXKMos?AaGr}@+ zfW6KPO`>aP`gr1K$cWRCD zoCi_(&8fpy<{m%WX^>!*?R1Q>qLLnW=CM`KTDO){&Qc~OKc}2;n3(*Wa@H#n=I4}i zP-~(k{oSe9K$qeZ9uv+v)tMO2=bSoBjOTMs14Tm5=bVmOqdad$p3ghW*otN{2SF}5 zSxjm*)1|oNY+z#2y5wwQV$!{cX9>ymR;YgAg<@O;I&qoFRv%a3Z$e>>%vyqS%= zBxwG2s%m1Z2sNn=>hOvZJ8RYYISiy^A6Yc(dT(2wWV zQbcRcVpi?BX)&Z=GR7(Qx+bpaDS2JHi7u&WV|m?NOiUZg>lV<&q8;os=g;ewi6KuQ zV)@)gF{Ecz%qQG-Ow4^;A-7u$SqiH{?l2~_+LIqvx456gkTNJ~VRwNd;Y!7=?mk7r zR#(J5udP(%zeCw?ckgVf%Vk#4i@A3*`4sbn9}$gWZZ#$*8pYgtOibB}xy_lF_!M)W z)Fc{>V(zOl3n$#<}gP54KD!3moG5M+BexgY< z^$PAxCiKoD)z01SyciADPDS^}7!8ri?%o&;)mIhwc#MX~z3v}O%>8n8H@UgWvqhvY zG&S7&W5~UzulwDHnV4wQa-WDHRPVLix0pD)bX`2)&SgR^VJJL5;4Y0Jwc)w8`;#JJ zOQ_@iqe$2iQrvtkR1Q_-_n;*_=r+_Ox^|K3HfKUDVG7bpb=xs9b&={m%fv)J)qRPH zshw2!ZB3$ek?M|NV(Oy4`zaF>!-w2uOiX+lxZ9XeG#)`o8@R_cQKg_KBMsc#kE(LH z=KX?3Zb2qy-qOe|%EUZJYvh(zB#ciZH$`id=hjH8u{(pU?r5#A4$a-UOibCEyI(Rf zWpD0&t%zQW>jgi}-L+by&H$v7shYdHW60_J*eT~8iy^PVs-;`Jr7D-T3HRM^fwXq3 z#gKs@ZQaI9Zr_G^FUaHWVI~XF=Es0M;hs|@Y#UFwgFEG8yDz1$5qzR&M~3qmYtFPUhWkpwa`yBvD#3%Mq35Yde2TFO*=)xXuRn5Rz$~n(Q2Hb;C5>XF%_u~ zan~yn*3Jj+L2ac{-;LBia_c{?@)J#cl-q=fNqv;tnu$q$l=~zTQx~J$XPKC~80Gd> zL`Q?ZBR0xiqctiThmiUwZpkN9>MB2{K*qYgHHqdY!|lt&q@LlXF)?M&aECB4Pj55a z;fm|tXa)PerCJkNtKp09^@jTG2i__6O|wO+Y&b;mV8U3QV05r z9-rxJXkWV370LGUT1nPT(0u8pGWqFu>{d{u1(S?idN=QvZU-j6;%Om`>R-A&G)Wp* zI7#iHTI#;Rq&JV@%iLj#47N@z!0rf){L9_NOz5oB!boeSdyq*R%#DkIeC_6WN|*F^ zJlDDtB+H%5q~4>OwgmmZg&V1`syQ%8@t`%OxB*(E6Kavv5Jhgy6wZ&6@GTR>lGPc z)yM3k>AhIHaJMiq`{MSv$F(2T4xfS5KKGSQI%0F$=(G;G{g{}3amXFWis*>F z3(artLQPzg=WKU56O-p`_gf|=&)M!qCMM6>?sg_7&)M!?CMM6>?qMb-&)M!tCb#ek zL$-UKNd*vE70Gt5G8vPl%YMww`K*rfED+KhbA=|+G2ysdlr`pjiQ{f*Ca<*8R>$2+ zOx|dwJ)dxEFc}U)o=>=SnV9#)Pr45?G4BGObRT76b|{^4A7@e?YYyb+l-r5Podixl=O_dnu#gt8FwQSQ_{2U zb|$8zXWe~FOi9nVN0^wBo^ww#F(v)Oy}-nj^bhwRCT54yc{kEU*Vm6+it}zRCQm)0 zBmbvcfJtu3vMM%qS3hM4rh%?{h~XTiAnvUJB5je#zTzHZLMy-@q7VM%o@J6B zWRxOTG>NAEw_E%<9Yd4)-)>nZCiTDFdzhHiue$d$F{xj5>oGCC`a9DUC4w^d8c~6;jUm} z+Oy?-$HcT}%iF}nwC5ym2NTntle}M;&}n}C;5mo)8xuOskJg%UcxN<;mLjKDqN|Q` zS02N2dUrAD1422>=~ZE3aY>WCnoLYdlf6_Xrlb+CF%whLh}W8lDXHx}$;6b@_PQ`J zC3UM58LaBG1RSUg4EwVp^~8Dloa{rX*_udV%!r zWl|etiXyc&iF(fEwP%g#7rDI7OpNDTUe5%p++G@M9_47{_J%O&%+bj0jbLIt=kdld zF`n~yQ<<0^cat}piRp1Sd5f5s)^fAAf{AG@H+yTCm{yn9+r-4Qy1d>_O`>Jb=N(sM zw6zTFc^2Z6&nwf7;yl`#4KfcTzc-mly^k<^1u5X|W>Nv11aP! zX0kLdzH$q4i&w0N)_ex?3rJC~Jrmjqe;lNQcaF)uAeTW(dnrA&6@9TN$9LHI>9u;1 z$Ovl^p80wp<-FZY7U3R*PAIDEt$9gnreTfxB1jdl(#x6*MSCVv)q9&sui|(E6n^gY z7BDGQKz}3bK5qjPdKZB_*YplCS&6y&t+0B)yTD}fR@|S0)bZ|mMWq#8C#mbDC^Fa` z%1;pLdJUP39-P4|>lqF>kTe^SUuHr(xIgUS_gm5#ob;hg9!P zCgx=6RBs>?^R{4pZy1wFs8c$yoQDWXOijwFVQz4-@jGDtwW3Qdcq2AHa8KjxFRp&W+##Bph7ZY>FR7>wy zMZzW6IUatJFu8-7=+UuaQ;ww4$B&iXsE7 z$8Jut`XYzzyiJOXw#s2=b$>+`zfM-8t)d`wPjjcktfs zNB#!8rX6oNs-aIDe z8rRKR%4FTgM)M65vtriGThGL_!*1SILohzk^{bn=i^&_vizX-({;iA9sX^bW9R8{_ zqg7PD2kGu*D-uSvyLU#B>?C8=-8-j97{eakHAQp`Y0lrntNfOZp?OEOr&mi8Yfm1G zy-2I4H&Bt#b5HM@BBRw_HTovb3tn=6@-srMKWp-`Ced;11@CP|^t*3+;rRt`4ikF! z?KsGb-l(@#exg^ISE6mqym|L;($~vSR`}xHV;G;|r=NEr#!t>QxFhv0r76$W=;kZtiy>Y|MfACjcSAG8>-!FA23Q?_!qXLy_q|a}&TPjHcaWjpekOF4p>M-| z=w+sp)d*|vaQ)4@;oeau^i9c!VKu^gW}wzAp90T_;Ycq{k zHp7~gCVwcRb2u0|%=B&_OeGC-INdAH#N=>>*OH0J;S8_4B07f@pBdgLO``Fc>18OQ z)A|5u&GeSA9}|sP-git)TAz74nV7Ub^L|lewA#Tn3VuHGjxy;jaNnfJDJGvC!`iAM z=b6w6!s>1QXm`hDLmVcLVZNcQ@+cDa<zp4xuVVUN-{AuIL|B3lF$5y)ainrMynJ;(}>`Cb?8N44iQAPc-tG;#0Qf}Kzxi@k|V%*doV`i}Fr zUPC6v^LJi`BD!sqf#-GJO+({7fA1AyVmyEE71Jc@`FpP`6XSWKw^EVN^JcH|uz1hg zyc$f5=WSjsO`@K+c|DjI&p&$KD57UgDai8>-Qwe>CPVe09JXY$Ox+Iag?AE-!p(sf>cD{GF!&v0n+ z`$w7lhL$i9q>#U9toB1Q#xFo_^;5^{bGK6!VWT`I7H6i~FaTtOcRF$m0G5CIRk2sGpYbuQACFLYfkO zWCG=IuxsY(cleUYV$RPUegP)Oa2=!>NJ;;8CKo{{&n5lROxiEeno@p6Cfz_tQ_8Qw zq+Jm`leyDRVe&i(Y3}qNW^y|}VJYpmU{Vnz0!?ZEaVA@majs)cytV2-!{i{ySE!3J zes?BwSyR@3nF+q|p)_UveoQXoZj1cfuyuXG?FT`*?NCkgL2E}=_RUfn5Eg*OM?I)_pM|*cAe?bh{4NWC~n8f_q-kN%=$kuX$gXWf$UcVZ$R9hWSvJ2YxrrOQVvI0f8zNdeaYfJ|DYm+ z-J-Cfb2IMuk29$NLf?|8>HopRe3h@3{}+>Th%;#(@N-O7Wp_=#sO|eqOuwk@=Ve0u zg1)g^$G?>c^$YsOZXLfQ6LStjieH|IIfo&|zn6(Q&!MjW026bbLtXzNCaVkTw(+3f zl*vvIis6HPTPEi0hrBj<4-feRn3yvk8u;%s z+0tCsX+!^GCI>+%KMnl}Ob)linhm1*us@B-Wso~DCOquVVN$rA_S48;%%n01`Dx^@ zV)Eke`dayjzn01SAkE$jIixH>@djNg^XJ6Iv7FGO_mvzVAsy|celk?WJF$^$&9qR_&1nL1fj1{bn)F8sua=PbkF&D zn3&UgpYv~FVxH`G^@}svERw8(sQ0e^T}&pez_?NcZ~prCFqsEJvy|uknwmswr<;!e z;$QggNl47|rjVE&N>LJ_9g<^Eijd4fi<%75-EXVX()FGnX}sXSt4OwI-ihe#k7Q!f z>g`WpV$$mEPtzpHq}AJB%fzJhqJKgWoz@(r{)&IwOdVBvBkU`XK7J`fuHpMmid0}S zBbR>q-^Z`T@UOH$cYwRlguV_`)xG<+~sg{S}Ig zu)6(>w?9EX^$#+si**TaF5aE==grktK{D>$p~>{uDWdNOmxE0ABlA=a-M`TP=(_y5 zFPWIS_}tIWWH-hrT7CN5zl}-bL%JP)?w4X><~E=E6_{*5AJm>}Xrg-e8l?WYKb$qj z^E`hnlY7qUwC4GfncSMBuX^+RSxk!M)csb<)UvXP@Wh2WtdD$ z)>e!CN=)u!&x`#UOx_r#XK0K46eh{Jja5TUR9ZWc)?)v*1v;%G9K$TX6ce-aAJ9eRPQ$dgRU zT*rG1iag6??B94gr$|pG_npx3$?{)iBAc2VrfH%|T2xsD3w24&sb%Z^yi80<*Za3J zq3>x@>g)YGm}DQtd`*#ZOj3{Q@n^kXg-K7WywQlX-ml5T4sG#tfCi2~5m6rThG8Oopale8RK8eg5Z) z=xf32DEmHtF>A~@rThKWOibDL`&*fqb4vI7`Nq3h|$8!L9-tXVg zM8$cqA_W%fIGeP7^>1fFUj!Qg&9DBQOw7rpzxpXmC@ng<^jH50MZ)>muYPZ>QE81) zezMrgw6SCU1}0DOm~hPB#>AWpdd%O=#GH3}%sE5CR35YZdZ)+zk^)%i!9TglP2RmJVp948G;^n1LTUog9*KPXK%y~0Ds_D+UlQ~ zxORhF^A9f9qzPu7B|)zHT~}!GI7m5=8~z$5SJ5x-0Z9rPuGAViA9sf!$w8(fBdl7O zhd&5n2N#%>x;e>u1jGs2uToa3F6h6!V74M7Ewl5}3s!4Q^eIdbe9y$}f(wG}Ow6jj z2=+4hsD-`*62TEBYu4$WD}z%^=-!>~l4Nj!$xA!29)%p{3a&AE2jm$=+^;F8;WPT& z!IO&USpoemcQ7P|JP)hf!9hjBweCE@F(zi+I8Sg=Te&IRFY*Lev?jWeoF^#q4W*Es zL@UYkU9+2lzKV>r+GD=@D$>dq>{dkQr$0!+U__R(ik|s-YcQ6HnR(tCOx7fN=I5=! zIVR@J&!R!&)jD-^=4XlEf+7Q~_Zr}t9_|fF1a-b8jZXc2q<%-xDuzq~DIFC2PHEgq z$n!FgazR-pd)w<#ytQ@kfS>X~XC{@gvvDKH z-N7G=@W9H6Njv|LMmaO(JOJedWl8l)*Q+B$CwvMbuTMr?vn?Py?{S+Bt%|Kf8T)0k<#hP}ox&xXzfmpAtZiZDAkh(!v zMMhXjAmq7zuu>5n!+IbMgMu5#YOpK5)2+8jP?SmEC5Dt{((;I2w`meoWb#9lRA=I0 zE!9XU{H=ERlX=1&A6^PH3Rq|%a^Jr@nYWZs)x?sK{ zVcDMzN^a3*e+FqSgjJW|A`?@C&jn(uE_=6=IE@3E=Ys~Cs54_XDbkt=of*4Jkzq09 z07$oB2NSxc{07oJ$hS>-wvOWZbsD5+FhY^A=e`hprAT=C>kGjaZ518)UkENJGMWl& z{S7}a1SPlYvj1}c{bCc|_6iF9q)AJ(4FS?SD7HhTuKW}Nc`0~D6Ln^636NKU;fjR$ zc{Nz12;O&Sgs}&jSA+H1Dtcz@Yr$3~X5H_#U^f%9#@IJF$i%EM_6<%jF>95t2Y)az zYn87De={-bhi?QqcB)diX8rKZAYfwF5BmjqnV9v%w}K)}vN4KQM=AOTC7I;Ng|9h) zyd6|vVonW83+`oNp0%X~wV9khq@T472p(c$p0y1KnlUkVweJLNnV40qcY=;g%ovp( zbY((&{pbpt9=yn;!79CqH86Oc$>SijiZw8Jhsh69(f^j=ZT8@OCI>+1J8Of2QJO^C z&)^{U&tXfTZy65`nrouYxowVUyc=XP*@!F1Qy}jJ)-JLNPqiHubYw!O+P(zM2f<1v zbgJz@kl{h0-P($tCDE78Mh3kV8DVYw82ufZaluGM^!PIqWPGqd6Zh~Gyl(|EA^0jr zL-Cmq9A?dfxVCpjA{oKS7|mi>Wd!aXN`0_PYhN2cCI)#lQPChj6NCF$V@BgiLERY5 zK3Gi((pY2K*yLbHg4N_;xFUy=aui6iDAmcqntk;1P}1+14OUfTyCS-z-^|B;o8XWl z;hwjt!3j;Gd)}r7=M)L|cw`3GV*F4VnL+Y?`k8LoSfD&{4M18E%1SJxz<_CAN=7rptz2bT?KS*U#zmPsFW`2;yWLH^uu1A`Y z34Rs?6IgRkF70PQu#Cwpl)EB4F9-@9(6uvw{2+%5g7Qqht*AXO4C*KnmTOVafHjBE zP$`Ftf*wp<%ty%cqF@t~&Ub0gi-K$>B`ayqi-W%u2|X_fl77|sF=by86k=k^z9gux zNUT*8)|iqm3A!;cC0!Cs{Fl{q)|gT(2{te>r9gfT#@FeRz*8jM%0TVVyLd~2Y6+TU zK?-ZypuTcp#90=6lA!r2n8=#VsGSq=^Hs2ci3=+t%Y#3e%t!4ISrIsgbbQXBc8IJD zZdD|V#;TwsYyLzIY46;spdpif@cbjl*FpCLt8aprSyNu>7XD2zDnXMKWUxkHr*mm| z&kANIXjTUcS@RkE`8L?WnrBghBG7yr6hExX)w6)^mEQ%G6bZ|HNbz!JAC-qgT!a*&7UJvK&vSwkon&k+3fI z1-n`EFj^Cx5V9{Q@|*Vj4eEm8vp;x_$yl^rI>+Nc@P;CxpI?J_SknxVzXL7d*I-G4 z=3uajHRA+kde9sUE+uFV1=m?)YUfaJQ?|~JshuN1NhYT3zXkU(p|VpnvV*3IggHDG zv}4WZsCO#qu^^MlcIr(i>G9w!llq7%mGoqg;~1qL`Z*N{Mba(u6L?rz3Ys$^Kh!c$ z2QMdBoethiusR)NC=y=He-Fe7N-MmY{~i=!Vy^gSf-4D{Gl6?jTN%ySpx^KDe$EEN zm>A8upzE1<&AFg26QlVf*l{ji^G9%$iP4-7F8mpy9iP2mNUim9tb14|e#Aq%DSFXluE(h*4O^oJB(EfV7 z=1S0miP8KOthBJK5K~`&1)G={&ELV;9PygJgIP?B=4xQs@tUhaE=6>!8$Ayzfx&Hx zWGB(R9(}>(pP*)phGu#zdqOT(QEr1&6xjDt#iex9p+Q<*h z-ftFDnPlIrNnY_qf}ecis{}v!#OfG7kD=`O#HJWOMDmMWOcs^I+YKNE#9>9k92OL3 z6bWmmpt!_VgAv1yuqr67GkNMx?Wd4Pc6GfUuYh}DXl@aL$%K0}DJ=3aDUCT2mGo9o zlu2>Sk*MB_h!RY$qwJK!+e8^AKOoQK`F2r>$wQo0QBi|Q9!{&6=&wjvisE80Yx?8* z-Wz_3i%AKZ5@H5x>Y&mohb2T-g60mffilSqZZG&dQcZ-sWg!6=o zA~P3h!g)ePv6zXurc@G}^2BQ@iM@)1(Wor46$$fPS)5TM-Rg{JEJJ=Oiz`faW2W;B z$UWk|n{*E6pkI)tim1!PLklNTRXnUn==omJiZwoFR-2)@SEMNtmaCeWMO(XK%2iD) zV`9oxU2Mo7ucKv04%4mG z=(*&%si?&y!k(LncNGcq++2Lbnv(3fxmfxy%{Tud>)C2M`q$k^tGPJKWCBJBs^u1< za0#6s`eqL0`B70rkudc~MasWOLt_QcWbNNvp#1%VMY^>)g(5_4VRa@gbArUl}rjiSwBuqnNB* zs^{3RiU~}vZZu>X6ZZ!_>wZ7-GnsZSET!k+Z0)64MDjE6~~h-QIg47l&coX{*EZe zBzc+6;XqMUkpb4}SvvJW;xk3U7BxgHQ6y|pL&PdY(k;4|NrmSj;yWgne2n@a?}<%J z@WQ3_D9HO_CzGc!e|{Qdm^jR2EM_u2K|T=2nPj7_z6A22Xx5ZUig~7|=YAiFXA}wZ zGhB3I%?XUFufuA%NMq8hBBB8@LQGGv8Y#YD&4pZeN(0SEu|bir)r}Ix9*u8NqeLYp zrqz8S8n%kpd?MO0F`Ch$R_l1pXwjI7(Toud+s13gh;~ejW~{jObi8J)5YK30G~-0c z&heUYqAC-k87~TTiPwx5WtbSv1hL_{c+CW{n~Bk6h%(Q|YcfPNMZ)$oQ9P(fSYH!G zBSpgd%88;i6S}XYyRAv0U4oxaMdt)RpNbwaex{=aKNYVh_?ayF#aPXOW{Mc6N%Z}K zOfiMY9p|ye4^5`{j0v41^gHfcGQ|Q#!g6JbRaz6hr_K~>6-l>RqZh1Ketux`T`BDP z1eq>=X0iq|%AFuH!~rI+-Gg;pkeMQz$+YrV-2|B>{$O(9K21Io*O<(%iKoEO%od^> z)kV6M@&I>b;Rr*EPcla5ufascv$c#R3B3Dzwjb47+CVSUXLnXD-U zQ3+_~iJzI=ggH_bkon>qlS7!3)K(;acgj!bXMwm)k#x(>ML8o|#3 z(SS)hJhuQ@D4t-_w3?2_A~A|d%Nm+27QZrCatEGV!)l4R!lWJA7kU0t1U=$&xK!j- zB;9J7M{AafGKz#_!ZMNeLVTNFCWbRH{o*UJqgTA zrFhK>k-@}hR*KHA$7@!KmlO%x>MGG+k+3dSiNT7bTir3z(mnMmF^b9e7}dKVK3|KZ zH^_6k^#{h@ULfCyR7JvQWQnXd<5SNPTNDXXUoG}35~jXd99AUV`T_mDFFdanCz*`J zTFToX--`20@}j5EnDCvr$mEyGnye95nB0L(kY=s8%H$j5c`*E}6FK|oQjEmamB@Ng zj7cZ-(+@y4h$>8~qt$&3^1Z0Vq%v9^k&U9AB4OEo5Ix?CFZ&Oo9}`nMo5Ya*@tRFy zv?5_NHjBxMq+7XjqZEkvW>M~Ko#%>$3~8iDtW_)4JcYKZt;VO3Rjg*JBI#D$sONS6 z(rjT(v0IFvL;up8X3byGw0ggjm{wm!(ybxUwD$i?bCfk3qkdi(s7v}sw4{R-3ER(R z@v$PYdcU!dR_VBK#vO0iR1X7cKtn*1zo zBv|bd&M;kH7jd_~09Lz1bw$Eb>=t!cQy`bt>=rGVOhlQ;YLDoxNSMRDqF;iay<#9+ zf(SX!6XGMibQ@D6^sVgcZ%Ubac_d3L*fC}(E1^LNB)rL$i%E49u}`BSRD}q z60DAh%mk~WB1@65&HpBv507tkzln}aOv}s`X(Qt`*DQGr~$Kh;wo}V@@XO zGHLK6q6%_Gv{EFD#u-t5QoQFg;(kTKdOs^3QY5VRv!baY=~hwHGVRhiD>@`-&WWz9 z*^FK=09Vj+;(aDPFeADXR)2_D30CLDeAf7AtEZtkFRn5ff!6dF$OTdCQ=MlMpGzWZ za(pQ+iET`b=CW8eC0=t`Y+zzES47s-c+C~Djfv6xC00(0*Zd_mF)^CI#s2B>n!m+q zCPs5r44WCRxhlphqT~F*b9h=RW@{2X4g0!S$fVO;ya7=OYj$EK`!Swxh%&R|J>L*D zm>7*ESI&voSaPExI(6J^T1oOKYbMRmSG^qa8WZx<1)3bP)?DSsn-C;ftI@l2$W%>| z-pr|Y_vMt2u%@ukr;_HB?O5}~e#|jZ(quV-i8jcR3t2WF?qKl=@uUSS!a-XFjloO0uycgRPt&;@&*VvMS4SOuB$j zTKCAY>$H`5bE=9=Sx+Q%Z4y(!!HHqf1s{E3P$ze6Qi;2l$ zb(y>&KJ^;1qar%3oZIj=lkB63TYV;WhpxfXN!g#tXj`8NcE21PVo-l#e{O$0-98rsz}&YQ)TlQKh$$m zWjjUEt!(VlX{)R{F!>NYt^-JY*_p|An4vuj@{oLy$-TH!AkskgXL9&nO&ZFfOwLuu zds5ImEJrfAhBdU;K^n=qOv)myK_HLF6-+Lb)TFW8z@#!flctH>$)p`T4+Ci`e__%e zp2vYSlUJCeAV)jHnJ^~nz$zK1!*hOnf!u2J)nQ zM3FG9CuK|4EDA6>D$R2VnhvrzYu?1&Rz+w!$fZn1+>a|Y$WwA{f>lSknKhXeb*t+r z_c6(+f>r>lr{#$Rt7qf|)*MBCT0!%SymON-*B4kddKRRUtfNR+icYctYu4!6 zLDN}wW=(sP;x%YG%g>p-gi;Iwc~*XvVAVygX3Zd!f_h39xs}OVD8)!vJtu!ju<9z0 zv!)i(%7CV;thia1;!&hE8{~QUup(h8y2%!-c@}9cgQlB&ipi5m>l={nvS)%-5BVx< zp2oax12jG4CkdLKaw2QYDsfLa=U z#coZE<`tQ?CtmZ49L~gOUX`2n#%o@c`{8g&1*8>fq2bpvLq9u z=_|+n8n5XqXE8CF*X6at@tW7AIHHNsydh^DkJr2*moYJ#H>GtZUh}5R!^CL%$##Fn zYx>D9iiB60x8zHTgst~2`Gz9t)^C{C(dzeGatQk|p8LzO7veqlmopRzJ-;m%DiV5r zTP{~5-KxrS+PCEf_G3J!$u$?_J*UYXOpIoL+;%BmGe90>Vl?l_E0^On?@0HGCPtGk zhhL4?q{~T)gn1q)XDO0yjn1R@*bkJan5;toqJ8*-rGJh5q+6Bl()Ug8%G(qP{S1+1 zSYzG`7$Unfq4xsF&-=1J6M8Rz?!Si05ea^V$#JYHi~P_zLc`=5MZ&)Pfh=@AzFZ&3 zGE7X_Ka`_x#A`m3nM{o4Be~MTL?fnOd?Yt9F`D60gDSyUTH$qlpaxA|lAIsVaRwLy@tf9N(Utl#-rYRDZeUwbKzRC&g==?h(ri^E+`lna?pGvCeXPv%<5M3i7c(&t z8zapD5=uF*%$hkKPoonItbTF`7^1@ci+bPvvALMl)FsD-^GpEXOMnmTQWfsz|zZ zD`q=1%bg+@vz75PMJC@G?`Mk4$HZu+O82&S%~V;4iP21xk7)_?UP&8hX zDU*w7Vl>m`?h^5u>GC)eqnRO3myFlUkbf%@*78hgmm*CVjhQl+BI(vH^b4xxnerAz zLaSM_RD#tkS%Iw@Ab?~wOV(gA5YG^4t>816!XyoIbt1E6Jw-y#pUY;7g!%bgwq>i@ z7%XV!@VR`F3GGGq(Z=S;XPMkxL6a|JPbOC?>$K*|-b~hDPEKf7(gSmPYkR|d0lM=X_Ao8WW z#^im@^HQ07C)Gu|)#@Hyie*wL5=P@InU6KJK6XF+d?m{$62@@3teRl8T-IW%Z8r9< z!fLrpWl|3_VInJJ;{>afvK4D`W1Oec8&=A<6baK>CErW1S|vxZm4)~;gy&UqNNHWJ zG5FB}A7AIjUN`W}D1pVl+R>e%0eOKgwZD zjApxRS0i4tU3O(+G(XA4_r+^|lI@uo%??@S{&>v}Sxu3!c6Q3zis;p5+ONJ-wooK& z2|MMJ|FU|Pt;%|MKdc{F^;RUTouB2vn(?XsEJrahIou_WKM=3kB`+xwroLO|s7;zM z&%33sNV;WG-z^I%5~jXKmah}e)ulZH(W@0o4 z<-tbrnuGF;B4Jby$-fl|OL|D=c!aFdtr-}jXyiX63n>yt^{`BB9PjzCY{kT+end8G z60bQT;THeaMd>A@?&er(2wmrxP?M<+A4Sr8p_qDH3`1ow4YNlwMBe>PRliq#;0{!ZdXL7wd!p=JC?^431_)yQQ9Qy(h`bn z4y&R1nbSISnto5VD&g%(`uo(m^t<_&WOZCl|DD4cgJ;tJ>F*<3=)X6?*)o``S{=^P z@Bj9r{Tlwi{Yk#)U#MUEr6&4+lPvvv`1Aj-bpEp+lXjS&|E&AJ|9jbKltz*@bE*D$ zB#(}JTNU3VYqCSX=djH0y+0;h4r>*j=TiJz{Yk$kTiq_u&m`;SQS>v1rFA)3m(03I zRClkc{~T7;Hl)vKZEr?Dli4nbfBwIx(ewT4NA;o3nGK$Opef|F5wijyWdGh42 zE?w5?C;mR6HSrwQpmsVwM%R6;<~Ndb9R2C>znj0e&Kv)C`km@2=^xT3S#PO!lw=vb z`Q7-V-;LhhxA%oS=H6`lR}OkH?As>F;Dme#}qZ&U08zuwp`->W|88em8&L zUPPD2{N4O+{(c5=inTYtC;mPD_ncNQTsO$>Kl5a3Jk}lllV6h$olfZIKl9L!N#~AT z@qW$k|I^=Z;dZfGjq5qB@r$V*upp@FA)@*j<@f(ZN8<#=#q`%adF=nz?|-MKafjOZ z$4zy6IfZ!z(-x6;oXmWf~d@ANnNmt+}EaiR2dzLGg# zdR(G%=E-M}Bjt>rR*+_2bz3H{(U3&ZJ}7NxTkyUtKpszdeU(zq&nzeCArsUsdJI zX{D-mmyEr4R9_M6WMLXd%)cZnFps92{`Lw%hNug3$__>FNx^>5v;seS4=U{8X&uK#B}ed$B@U)^u1 zef@v2!>Jc)+#@@kPi(H|>$XW(k8?S#|7|}1lm35`&;QQuzssk&uIc%Ro+nZLQ2wbM z=yHYeOw?1l|64uPtM>cvd5)g{<**X-VXo(ie>drxzw3G9e{G-m_e6U$pG-`j=9Lr& zGp|h489(tlYRmL5NtK8CwJvu!o@zfy7R|^0yT6AjJ!=(@|g@Du(glZ6?|ZY%%Y3BM-9qAAAMD{aFdSv@C^7FjFrrLfw&xn6mu1_=dtMc^Helw-F^CO@2 zXS!ZUe<+U^dJ=EvQ8VW+k1x-^^?WSk_$aljlrvL0X-7#X`t^3@Ri0k>n@L{c&r5js ztG2x*Jj%^?uElsM;}o@XIexE8C_XSJU>u`(vWL`vhuk=7?WOn=rFlc-8cG*(>9)0h zVpks?Bl;m;k085h>27O>NnhToT+yfPl`HAqZn-4)w<=fKWqajHy0=@d%u{4OBl8~d zXC-`@*8@Cr+_fY}%#+-FNYV>l=>0fh+wpKWe-Szo3cZzXK6mj;mhN?T+OYR(D-Y4* zne^SxSHe1vwdqTK$=6;WdVx6%JQLsF#<)uU5czqe57v%(W(xWT@6ia~^iJtzUF6r! ze&zpa^Ige)b6^I)Wz$Lg=4akn{F4vb{1@D9Ln)8^dn(_~Q+<=nT0IweOvh6_C?Dzd z-y6UDr$m3|{6Bo1_zTP_zo9Vf=HU@@DYp~mD?HDNnG3NlFl$zPMm~g&tzX#e!G3DQ z(Th5In1?XExaokt(Y)vHt=IPC^8YXOw)VvO3uGrm9@5{b-_SbATj44Gw4JP9bOzS_ z=-sZL+4U&0qc%P;6i@oM^?H@Om;8S_u6S%usRxChC;h+|qh0?O`%89<^z=a3b&41K zbUQ`*CGj?tev0pmm*takzi}+l6ThO|KiK}elq2IK@$Z8V;eY*ii9T+!aA@mCa6nxANB9gqAujG zJ@6jezSGlDz1|E@?RMn;BnO+H`u_#T(7UWFi~K`oFSe^CeEGY`<4f(Gu5CA|>-CB5zMrT#JfeR}<-&kv{`(vK*;j0<89NnYjtx*dMP|5z3XCBA6efInLp35dT@^07xoV%-<(Z>2xaSUx?oGy4tl?z?eoYx<-&M4$A*@)hRsi^{2Rez2tz zGTl#5I?s)#zR9p12$|;1HvbFjto&!Q93;O@PxhbU--@m+htklW@Vzy^q(|lQ*zagc z@0-_oe=cNxf$@U!3tsH5$jjPw*}w3Oyr0YKT)vsb^x&VrNOa+!v!53>)P6*_()qpB z>{pf6_x;-_K4kvp{7zZdFUMQGE%|9S-Zx*ng5(!613$Cn2;TA)GOuvIz^|}!Iby%$ zT|(b9ay?4&7d~!cy)5djh4{k*t z;|J?m$oWHo<1cJ3V*QECAP?bB`g!SH=-GPObrWh|vES04zsGWrcKrX}%@l6kkp3)jcJ7OT)#JAp`ex~mh;GPKa6b6?_!SH)*On(?soZp6BJn$MdwXUz%MES*6RL;sAz`Wg zgkRC`e>Oj&#~*Zh^=@a!Y`aUp_sw!12QmL-`{^6I-xV@6?vGX-XGn{UiVBW5`46r2qbc&2P&q@g;g{?QF>W=5?FS*2g!toRASc zxASw+Z`i^AwCT&~(61a4zakHtj&Sr>%6Dcfz57c4t>m#idHr9+OFeD>4H?^iOZA*7 zUfPdBvJ)e`e-SdT^L#TfPhCd%uvy~lu}v?2V2JkvseaN95^wz>&rE+Oy%~gmN#(3y zyXLuZ6qeG_x9z>{yZHa&XOaHF+8OFkWM{X|4}O3rzQpcGzZ1U7?WMG@E#EW6|DpWY z$8>g0%C-LHw*BLL*Wc!Fy|CYmZz0J1g7~2Fsot_4WXJ8&yX9|Ny297LDm;zn2cG#1 z+v9(J`EpJ~&YRrH<4wp|`|lYW@0-fsle|46>BxVXK5vrsgn#s0is+Hh5&k5+2>MR# zE^;Y<|BD;9#D3a#DcP+zZzrNje={*i3&Too3Ix*f~r}fJ6a?9Ums)z8m+RdxW z^U=EVo7Ky%M~4jMBfq9RpU}1AFV54r_8~cu|0wutonI;W=dnGK`Ao=s{+m>P+>xIF zFLvy^d_Ey$-sSrFTiG+R)1)_Kuk1R8XKua8mSaPlOJMs}YERM6?S-~qS-)z!+(gf0 z9dxF2;y+3`)_;`o2=;{i5Z_$P{(@caAUphsv*TiKtiOqQBKw;G`^PlSiJad_y6JXZ z@>%;Q&XY6|^pZLi(eaQTFlIR5H=A{&dO@`-}rS+(- z?P_VAPU>ap`(}Sv?o4vtUVDqa+HpT*Z2bcBoU=>PJ~Pp``FxiTegVs;WN)UAqom(6 z(K(*|70j!DW$l`sw~HMutyhTN+WlyplX2}%^9^cuntzjDx|Hp|-Tx}JE6JMvJR{|a zJc;j8x{|;DX5~nEHH~bsXjhK-aD2$rjwmNSu_1iYI z`>3*BNHpnB$}8>b(f;0azGc6!+}>DxX?zepw(B;QI?=cMmD0)i3!A^B&vdSe>P_dO zsNN49Ng?Ln-2P#=ZWhsV#G*(4s?hos!~^|pzkR9wDV^{mdMo=0g8zSODCd0F@_f%X z<^G<;ODKMwyvx1{z0){E`yUdL+$G(??wql#Z%G)Np!UJJA?{BhbCX-wk@-*gy2qmI*>U8Mfj_hZ}6c3xrEAxiTNS%;F)H(S`Amc|n)SJstx<@KskIy*lL%uBp(5Z3wh zM|QO9BQhV5br72$^X?6nuX}m@7JRvPp-=pioMhfJQ%L2|emKQby@dYuV$`dImszaVn8`Fum`FQgxz zcK1!*z`76B-_jGm0Ovx+2p^b>I1D>F5p%=-gfFdwe3<3AEkF0Tbt~b=(hE6yfuk4R zhMufnNPf}J-B?etKJV=QdA!~xe963B_Q66%*6H3%U#H92>RU} zk$Ovdskg0P;N*qziscn?^^0mg@*hcmM8B=P#V(fSLtEn|{+)-ke@EjL`K6`5(t5Yp z-%4&jNrC-`vUeJ1Nnf5Hp)}j~Yi0kJ?YUaynbBT&yf9sXL#SM6hD*SB6Mv$ z_I-X%{Kz~{_UQ;mf1a`Xq*DLVyFE9I^&Y4HcAw36`wJoSGTTqP??&xU`)<_!zg$mY z)I`DWtXW&{yHR%a%ew$4nar9 z&EF-R4M{((p3A;hY5iFIZYp>B{7LrBslCasvhpvr`&n*ZK=#wN-Z%El*89YzcUzwI z--xg2=iv(Xr?FMLx2BEB9$Uv)f6;r(H~d$uS54<%__XJ?JTsjil8eNb)3bgs z)|;^2O!R#0(^0>;=>TfSZR;)RFW`A@X&=y@lPkRoAA+ZIo^M7^?gNROtX|1I3wu6| z2T+o!ayY3FHjPA_cE<@0S3KKDWGLg%}Q zGs}0#^gu7kZrb&au-Yr3Fa9C*L$POMZz+ALolD~j*^#%C&e~(qk5Ybn5764pww!^K}YVLzL$?qwVPBlkq9J*|Hr_fCoC^grqd_p|AJ3wCIXuD##t^S9}#UC8bcAKSYROn&9e>9)3;RL)Fv z-|RlHXy0`H=w9x0{;XU|^9=FB|GxXgGxICuy!riJ;S~EZ?wrNjxj#(xvgv$x&lu~A zypI>Sd&Z^v!g6kNdN{pb5T4rM0?aQ+K7Y?U^)%8);!DN@yZ%tB-`l;nEPk!@M|l_f zB<~V0;q?AM^|0qreY1f5nvnUQNn1ZTr&^x=E?&Pct*dqM`fy-w`MvEwKG!c|QoOHT zs@F{P0 zzwLhMjfYvj?EX~X*8fBgOY8HNk9Ybmbl!e=+BMehKlz}w7Zj3w{%QNlGtig)I4YmY zlk+}%;|Dg#{s|xD?{=Q$yM1AtlX!sgaNP`w9%X#&Hq*NE_Tpv#UDo<oBb)+DFcf z2z}aLr+7IBf8l1TN5uS*&so@e2Q=Q;^E;(}BmyZ$`0 zzREhLrBhm;xAh6T`b6Bmd(@q;kGXp?rE@{jKP7B(`vX^Ce~I|oTArRMkDnm(D*ET{#y< zA(bolBcxsB97Op!utRwt9^d_%pz=a|?uY2v`wrXo+v)j9pXrH zBqv!1x9yDkHco$~|BD=Df8tNB9VOnTFUecdZ!bKC*PDIw^*`J8lzH!TJjw4&jxXJ} zeY1G#PkV5>(*5S?^`dqadqw!I?3ergnoTeAkPtm_nx9Ad^FDV@`=3R}`kD3|7}eLd zL#cdumvpv#tEbd{<@hiBkn}Dv|8)9r6WWTe7x97r2dPn)lPSHI@n*U0FDNkqh(e_75 zXVcsBrDVV8I|3wsd!EyCA?z;jBsc5VdFDT#weRKf-rl>|ZKxu5y;l;!8G=u*At`yNyeS=W{HV!vd6o$j@k%Y*Vsyp>bP$tPg`DZQ0j zNnVm(&d1t(Ha*d^^)21YrFXJ-apW56o$>5%P5SPO>Q5A;)(7j zFyAEmQ}0o|u@BDYf3fe%b_n-Q_&yizi@Nwr;fE5v+3q~kANZU>X`lb~EYU0ZtM>kA z#O(i9$`^I(G%<71lk^@pkHfE^?=F0w$Dayw7{-0_SKs?-qJ#T)&L6OT56+)3oxr?4 zPU*s?73;fHuP%&-M4$3gKH=*w<|kw}IlipF88$DWJo>JdO&>KsbKirJeAW*yo!6m! zRNh4_&j_CfqVi~dPX2c_&c9N9+HR-!g!yqFg%xHo#y_f$J?~Pf=T_vriky3~=jG+R zPl^9CSkAb2#O)Cndu}Ie?75wYJGT=x_S{a)osW6*{BL$XN6rt?c^hhfTfc43=h*oR z)?HA4(icic_g#qZ>2&4Z$}{&-I{6cRtp7^-Z|5_D_su?TUEj)K+kDb4TgzkHbhdpx zW6LkmwRW-Ge}D7wf$YdkexvnUO8yYpFPd-A_bX_f*M4ucWH0~O=XGRUSX?`pD?D#MFO6?6SDL>6e$R3csll|H4CQC>B&6()Q{B1OE`CRPg3oCcD^nUh+rMEMe z6E&^wTomnJkbSv|&*_!ye=Y3cbpHR##f!enK8Nh9SpR|Y(4WjFOY|h2%va<*kIaW< zKK`#ce`L8LzC`cdNl5)x{0QooWM_nLsfRs>hVlJjTYu|+VBT2v{fe2sTOoMa2es=l zrTh8h$CF;z^_YnI#p18M)9+-z;nt5{cjp_**NbL4*D#aZ#D9?ec}XYpfCI0za(QQA zsol!g%U}H;OHb&}6qc7K>4Z;tKcBznQksWYeHMSX#E0y^4LZ5y-8q}v|Hbd+<;lC1 zbBRCMpDyQ1__N=qmHjWzNIIcc{x0n(q0o_Z@;*~2diH-ETK}gc7x@l~e2=4C-=%)y zKgsu9?DxGq{cc5hK1pxq`z8Bw?bB92C6soNa{kq!J?CEH=N~Q4_V3cYWudpw%@=11 zx9&%tDc1uzA3Rei{j)ruyzjo=%31CSN+|Pd@dNC9EO7S~OZyAu>FoW)ZPUqoQv5C% z59mA`jR)cvh~1a=mV1un?;;mjuai*nOa1;;q44wO^};zLp0DBF2A|84@!U7EUjBB^ zflEDQoU-pFd6n1C`eFE9$X5P_r}DLanD4${f%PpnUwm_X$&ZtJ6K|fb^gWEvJAD%U zo+-V22Sem2=iud>`evS|l=`3Ox6rlmCHo}lC4aeG{@!;fPeSQW@^0_(`KIGl;w7Z( zKk^-}&qin-;FIy}B#;?Bp~_YxiP$7KK7zLPG{-?rz#-^rb`%^K=*5cqzd%qW?CW2`}m7+*c`GJJx|{WyJbx zCA|2hBCi{q9g|S_l<-!!E+YCTq3DC86TF0iFCV9*UJ^gX^L6>&ru<$E)*Y`Po;@S` zRT4^iJ05R8pY2z;zwf?-ChxLNBkz~}!j?DF`%LL2pM<`%L*=2^JG(xCwVHo&I?H!y zULxg{x(REX{i5I-cmC{$6kD6KLMYDrB z#?&MH5N?rt7|&kj4m>ZK2Ecm*-W%{o@O&K40eB9?b2y&Q;5hyb}PQ zgl8Gxc7$h|>%1=`{0g2Np7Zd09ZwgY3y|kRb1t42&4s2Ay2wu&=j6G@cb2V#(U9(@x;8kU_QbHc;4;hy!UwL;(5`$$18+(M7Rr{ zUGePcZ7?79&I=uZ@Mt{8;8}|2SUkt!X~lCqo)hq#i033c%kZ3x=M+3`cuw_>F{gpX z>0YZ@?ww>l2lzjL{~Dh2@pR$20MCUe?;<=Gyh_*)S(~mH{kg%Jm1Gtz;i2}+wk0u=MFq;@caPJy?6%k+=u6W zJP+VmkLO`LLwFv?^8}u!@cab4KZ|e_&vSTwf#;Wap2zb7o|o{vjAsJRZ}9vU&m^AT z;rTtDKX?o9EDHU>n~Tsx_@dbid=bwUJjUN(JUjuO2%Z?81fB|iEuI%m5@8bIdx3i& zo(!Iy@$7=<{dji8vk=b*@a%@C9?u8y?2cy-JbU8V3r_={z47dW=VN$2j;9gNzIgV> zvlwL@fbc*(pTzSiJO|@x#`AA@TJRi-=hJu&!?Og>Qa|qkgi05oPU&3<^_&C=ejh~CK6YpQf^Hn_mf%mw1 z&vP`^;1{bI3InQD+)fN7fZLOyS%4NPv{<2Lg$`F}sY1&XTCUIvg*q9U1IpbDy$jGP zhKQ>^h1M{%6L9Mkw~?Xu1GmzndVG-bdh#2mt33H_(?!12axp_6r*sTajaG*!b}^t^ z7$O<$6cCQM+LIyTWf4P^W3l3vhK2HGhKPeLidz<;Si)`aKt;c*FH?4O8uE*?#J^l{?>Q!8?;_`~iE3RL0{fg@`_uz!-5~dj&eQ6G8tVO-Ti7Pl~(hSWaBxQDJWurcVh-o6-+KE+U{gGSBn z7a4OTaHHn5Q}H|M4E^yWfu1|vnBy7u+sjcpLvfsKIgOzJr*No^M$O%aS!mphVh6Je zv6JSUpBVEUhVJ{FG1oCf=U8rLh*p4z@+AM}RDmJ-)u}ZM(eG@nWr$|%>i~_LF8Gpz z44sGB<`aNcsH`@6hhWF)8Q?a0Ppro8rZeY9Cz6{fK&ZCznRh%ILk&96w}CQR`b&{)$HU+u|+2dfHA%H^rJmKe`=o z87BftGSmqu%}^hpI))wwlwoKSpn8UWuh6^zJ)UugD)co#jg0$m#zmh-9RM{ct~+`f z&ZhhxxE99k4AYfmXc?eZhDaK%9^FB`opE&A{6U5;f>1UBYEycx-fiOb! z-ZPjBp9iQr`URYpzX;F@Z& q_KzluN`WkE-j;LS{XZiz?iF%qetu3<<0q!F}DHN zI}LZwUa$r836Qv%sx3m*AGsYk)evU13YC zwI#bj)?$_RtzpiAA2To`N@diOem?3+zZ~^M@5eQE(jzOd6nQ5-?fahgeU;0kM=M!u z1w6F^o>~Eq&bgh;RMZ}5x#L>y6!S+CpYrI$={n??(lVyBrKhx|C%n%=bMEJK(&iK1 z1(wG$~-iX*brBbI<>Xb^I zQpxzzg7rSN(do!r@6+#`tzd|L0qx5S(Qllc&ydJI<4c=od};FrrPs*xhLEFC={5R7 zuhFO9PJ5hViSo}G63Puqxj`v6X)T+4>G4e}@h1QC)y7o8@oZ7KH2DWX;(Gv>Ra`4W z#{k!+^xBkOn@=mqB>Og{+~$86eUK=(`8T7#5xsWJ+pc-r{fEbF-gckn*F>dVso0VD ze$G3F79@J@eyrBg>ri?fzG!TR)~G}4k<)ZJO_x)ibINH>IqlLMU7DjyIqgzTyL{oQ zOS#H=zx%Yc2U+g{_?QbSXsp=$61)*WJ$}>CHnzu?*dAYEd;L?7u(9=C#gPI@x_YJ3 zps@{FMuWz-c;9wZS~RvrV_W?@U2Lmz(5f8dwdQ%B?)PWGb3fzAI_9}AoC#ds&qH(0 z1ytZz>QMu##e=NH1Be~ezBQ(XXMOUjS%S>#@SW`#_AQz>TZK$5mG2 zDyt3AHCKv9yZ`;dJ(WgfOe#Iw%R-gJ3#FS4Xd~C0MuUw}@ys_y55uHqKF6lMWz2gR z+6Zmhg`tmKE>IQv^lpsng_nzt3o1|k7Be8mwZ0=cV%XUv@(n?ujr2&i#dEP2<@1J~)T z$K0S2`8y+DybUq|w8EqQRtv~_rSAuHxPL2b6V?21|A2=qv?lsl^t`|N`Cvdz zT(_eb5*aip_e~)hacD;06rykBkdM@)^=%HxINcngar#tHsbwwscR=yb(P-Zy}k$VQkNPF>^&{=#F~O_DVplAz6E93&|Qqcl0Uf8uj>gjqT9b z!~O3&zteJX2B_q;jKlpy;KAPj+$R4Nj5rSf>eATm=%vp7?WtNaroQ|pzy1ft{2V#P z)S699i1-AV!K=%2x9^s`Z_E^kUY`SY< zF(bfj^3MdPNkGe^ui^$l8qk{PyWuCk3((@&-zG8IGwwsc?G30W^nTRi2tb>;Jx*fi zgB#InA+^o^&(^qJ;r|)BL8Wc>uYS_blqNU_Y4Jjyhtl{lp*&CcgU~C=G2v%j-U)xf z6M`FFE6@=y7_7Ndx;OfMaVg zu7<=z9t_b~dphIj?$a3zi9HxldIL&tsKj${*zv}E13896d3f9;@$P8+I*i@G+0p7r zKqH)kZ09o7p<4fB=tgoj^&ZjUPVaacaTu3+)|dr=Mnhl4xV1Z=kx<_;v|<1%v0?Ch z2yn||yWeiiVSvU%XF)FK0$Lbt0qz2Z2Jf}TG~rv+?vKq9J(j9c~dfcj#KKVnP=pyi=0 zkinM$t&a7hzSL7zgx-rdp5p{EZ4mkfmaWFY+Y`6s`K7KKvY68j*yssywwbl(1GRY1%A_&PgI zFN`j6ZIo8Z3!`VRH|F1vZcVJK-)*br%62a~G z8G+6{T%em2H}oTmTNPSxv_L{{RcIfSOC!m$&^h3_oj6eI*vGObYq25r@96FqB6dS; zKeS*Ept^wUP#>U;u^k@7mBnx_$4&)QN*?eIz|ODMzsgjLx010rLWejM%Y#7*AQ#h zLAC%I(7rX`Nsmf-r;$~jN2{yU-y(oEu*B;CSxJ5XP)8sV>hsASd>puC(Rr_fb3hBD zG1Q}(A@Xex<5*g^{TM9avgo5v!Mg@-1>Nvo`d}`Q9-7no=7JZU9hwNe=LfL=plnB2s`*4nebG?e)y70l%WIqU~?Hd6k4*8A))MXdyt-P(VdGf#*r26 zU_Jdca*V}JMHxkghEc{}82T;B@aI$Pp(rB`Xs7sM$aEH<9@UK%{%glThk#ocC+U6~ zP-pCoD=-IR+{>s3;r5L8{Tw!fp|7HUTn?znYfEIuGfa=5DPQzph5xr>Eaeq`CA6Jd zAs*CbZNH2M4e%|f-QvMZ@SiP2es&J&l7{q;=ymg|{Wwa?E6@F^&joG40fh!NT`H(r zikV0)MpLzLLmE4*P)(B@&XL%TC1dwfNe zt{qbv5xa~zpx&Kk>&UBq3S|_6|AHPx*0DQEZTSH5c1M?BrcSfF`Y_GL&S74}Iu=>> zZVt}+v_J(Jl0Mx;&6fsBKl!A?tTpXm(#2>DT~ZdPm78Qk7ucjr2T4d9ew zJA;?N6}5S1a4op9&|%=pLhHemO(#D3I!{)+7sao>+VZ^4li6oyaPG4<$BN(z@ccn= zy2b0h2NoDmm+D4iSXNCN!!oyO49gm5lg2h_Y?H>egk!KO{{ed0@DhxJ)E=WMjaHRf z8$%?ac7+zl7q5q|A#Yn){Ktda}1f}(`P7+sk zE`In9(h3+pOdoSf-tZ#!Zm6`r;8<9*4y5ZqzNln27kFGp?SuxsJ>-U#0oc{^i^VecCN4RY+K7?Ri_mJ8XOVU^H` zw&iG;Rz$8sj?pmfs@}{H-QKvBA=!}_4L|uH=JAY^S<#5w@&lcY2LaB{Z1QsrFBZBPN`&=3eBf8N+qLIG7dgy!D#5 zUh~!~2lYy&Ua1U)X%04qc5C4CDr9{c`7{gJjiIo38BHqF7B07LN32U}xh-05i`Kj) zLMIS2oK9M+N!z1I+as&=vPv(j^s*7r_N>y&D)+6Nms+qjLf`LMhSFNKmaUqujr~~i z3fd#$=X5ZRM)3)?{9|g@CUhJe3&?hoy_yJ`0FhNG`Z7-$Q-5+SpplqXFeY@AoCs(f zBuhOJ$mlnr<6BN;np3&tR4!f2A6cIs<+N9G^lFY?&5_sGyvF7=wqIlWHMU=43tR>& zX$G{kLDh&M)rieO?7!{EzB#z~XsnX#1X~=Tagcn+Va>ZZMl;Pv5j&!|QHH2S;|fhG zRAh)am|}=pW;`P60^<>x6-`ED&J;wYp9fLt=Rs8Zc`_<1*2$>oMlvcrIT;n5Oh?5Y z)bZ-RU85ksbIp69zgk8{%gAUM#fZ$A)~gP!^gCOvk6y3z8WigD2Ql_!-$yeRn!S?` zyexh)JjP|f*^!-O(5N|@qB3J{iOP&QtFf&b+orMY%5%H&+^#%#Xx^McT?(y;M`3e5 zgLz$N{O?@_|d4x7lGS}$IJf!gxU5J z##{=>V+pa>99#z7_#tq1&Ep|Ji{o+l%H&n8XP<`p8>svMYnF)Zj*FbT<5yi{=N~(T zuSX7&)w1Yk?=pPq%C6kSb|xyc$5IK%t{;#GzaciU1}+V7X>&5xhW7;26FvArtQj#* z)}Ob83Rj^F;8w-I4?nRT(3a2+fycA=X0F@UIrbjJ5(n0Iyb8FU5Ybyp5XWOr!hggL(GGwnyh8?z*_EOEfyV5|u}8u;I|5L@ zwt2s{dB3)KFKfvaNLNrTDMV$qvmz|g?d5qC@i(9vvE2XbpX}&75GAWe<3bVUr#tg**auKqAHIIjN^*U8 z-;LH{t`C#0QM%3km54o!p-+7mzBh6->#Ev@@NU@U`5kcU;;Wv7Z3eX2KMs`b`u(YZ z!pOUk`J=jR4EJR%<&EL`&j_^q4Z8-vG5npE6?#FS2i8lvR}UBH6|_C^w=o>)7u=DR0tN7z@jsvpbL-olRkxeQpZpQICzt z>v=L?oe0Z(a8k8>Qnh_jwY{jZMU5?L>=5q93Zldxk-7>m{*YQPe_+BpU0>c`T#+Fj|oI}oKBNw z%$dK&Jsgfb0jE0O3n;7nWz3&{iPn!1PPod(q};5Qn^mr|T+2qLciJKL3~p;|K6>6V z;M!uezR>}wJtpfLS?2jd&Os9YCZG-R5O~f5>QKGvh|w>bJOo^h+njnzS8Pri(g3b2 z_Thc8d&tmxfD7%0k&g4y$leiaha`3Zu6G*laoB&dO?ky-3~|tebp0{%(oSQD=8ZHz z?~l=M{hY}-`n8`gFeLt3K{+kNB*(`11U!!$k#1xB16$Ce01d=s&tWh|KG%BRr4_BbF8#S#z=b%vs`#bk$I`DhwY4sFFMXO zS_0g-@;4q6?nh(dsgB0PQ_Ywc(cjKTj!A97qPF0awqVA{Ifaaoa|#(V1iAkdc{64J zc4-_?z}^F$CC-?WcSdDDNYM58Zy~WIL7eOm^@Vg?S|J@5nWp3P<)4Mf1swIQ3WB5_ z8AJW!V~DMbOaINpe}MG^E7Q9GwIa5jc_H0si2us9YD4@dU$-sY5O2oXE6w*C;P(x~M&#A&Vm4&WN%PoZDk1E@*M$e3k^;5-e-z7O#NbARLAg81-Kt0lehD=-LB>-THke$CsjGVP5&@(6T|xfhM-jjt(Dak|l~ z8qpj7&>E{bz40gZ$Gr*UEyQJx2pK#iav|HkhAGecq&?9ypqjYFTm1z3C1O|U%&<2e z`4Mam=eQPn`Vyc)<$h4PAB@v)a#6ZLt;ech)4jIlLtF;U9D3vXy^ejR55d2PpK=?< zb3h|;S()gKe-$~h94o8rz45zIqho;^ii__!%Jg6?%xHWN-u34YI~Ly?(Aj``;~TEU zN;#m_yq|Xgpib`z%nYG2fUf!`(oihlE248+-O*2?+#5OX$HCt^K;tTxNruRODQZ0? zm6xJIQ*oL32MK}Fo{V&9uM=bFIiQmEPQ29elJ*`w(4G)adn+Fk+)1 zqek^D8WS>qYf`Au2!D-6PVzSDIMb-(OrwcKa7&2G_$$VlGZ>N)vC+sV*^;1<B-qdC&r_@5SvYqA2H0(`M^C5s8wa(rcit0Z)Za9F&eigRza`!+>4+W zfFldio;a@qtIoi6XlvyXSyt*cQcMzCChz8^r+%_Zmy12n4T5@e<5 z9C9x4eymv@hrF9rW4pB6RlF{BI#b>Q>Au8}Sd~?}7SxfD`BpCRX=h7viIyg7BYIdu zG`{t)gjRt{k4nhyNZbKjuhytH@eF$R2FB5?g{K+%H7L;ShP=wEH*wZ{dy}DGaRr9x zo>CzpGnPW)k~XVDg~ZdKd^yo)>5`a%!l_(7MH+z(Ll?7}{jWGbhbyGF|w}GOZjp8L{$q z<<8q1D_(J$mDd2Wyu3%Dj{=(1)|yP5>}=wsw!&oMcvu1I@srv{liY$d|DDwKm`n^D zY-fv;3AyJ`uk(~iZV#H9HcZ2bPEKmeWH^>QZZC1r?Krst{)(z$-OxwWO>f=30qazBCoa)&^)zc35EVq@_2B?4s+R|r&i zMJbRS*^Pnhxo!;PHp0e$ZXQs&)zf&9b(+=6)oSHxwQ{vOI1^@-I9MGBf2#xGZ#D0K z*jV9jwU)bD%e5y4Dcv$(PUMxa)J>=B}Ya-|8;V~jMmG}T~2LnoTY3%VZL|#xvp?ZbZMZS3))_6FF z^xAcin-nK|h7A=GyGlT5kR(qCYRY+E0SA{Nf8oMg=!_Qc4S`~T*-Y{vz zs?cMX3sir!KrQ_O$+?kqh3pljE53tS>I2|3&!=a}(&Tl&r&G_hER4|&_@5%(P6;}V z_6#6Q$raRg+4ng&~q;XN-2q=&bH?PgXBmDrB{`r9wP~ zEaxC=+p18TLhTIk3X4KH?zV;+mVF8U)$X?(`h3o~6R6O~hJ(n?3 zA^z#8Qtpnv3#*qWd<=6J#Z59qty)xQvO-p2iwaFvNWUy9)XbLu7SNkgdO=d=8cBt+ z6|x_nPRhPtT~bEfOj24ala$t~Pf8nQE2QVODwPJM(x_BgHC>ygYtnQrnyyXLb%yKQ z_|X~u;hpxpS!cKcJ%!G*c7|^}(pr_y@UOoiQ0rQOj&Zv|o#A(5SC#B;XZVQ#H{d@` z&}|C+=~BbEY*MUuHYwISn-uHa9i@{_m5mr{c`soXK&>jj<-Bvz09>2m4o{qjb^arO zYfql}KI{FrCojTE8GUtQxpx*kh0_q*q2+dHxgA<=E=f8>XEkz3n%R6GIdVxkp^;0{ z?|sl&ja*W+sVnJYb>U&8^K^%;D|sx=n~@z_6#D$LRzf|=123}vcu!Kk{Lqt>(XS^d z>yy1n(W|B2YnNfK2bA;5b6$DQE6@GPb3gN3y)S(9q}=}QSMK|j`~IZd@9x)n6qpLF zeHD~SAt|S03Yu;}(+z040WEDna|~!11Dbb`TZ{VEpynOayn~u|Q1cEZzXOX*cew|X zYj3%YrS}As;wNmUxYo*wYHZG0E&~}A7Dy2u|6xXGYy;;|^KgLGI^(vI- zn$z8z{%JUAqe7*O@#})m{RV4&ppw@%8qgetN|8oh>yhVJYMBBy=UCw)(2U5*YU+v#{F*yuF|C& zR8H3i7s8+1jnf_Ce6#hzT39$LV}0vxUE%Z@vWhvhPt_Vs+ z7rDIabUu@c%6w*>&S!>|({;hwXssS_HKMqbcNA(wU+WoF4I5Pr8&wT!s*ttUNkhBi zv=%;TF2OiMP&#d?~%Zbo8y6_em-vGD_Y}~GUkm}%9uCK`aVG!9Bs%u$@L|A zla;hKw*t83iJv@Xy~E{+MO!e#0B)zyS1_Bf-zuSV<`)B3)VxK`dlhg~m3n)*O1>4b z$s2&i-ig>vyyE%`Kta_DyTaRK=xNN&LkGelRf%U5RE3`heT+S6rIN0aFGQp{FYQaF zt5#Cp-3U5(4@)my^$;MUmsTouN~Nyq;W0bv)>YBXT{>Y}r}XNo+CY`))hWHYs?3Kh zy*j0rsgj$(6I!?WszuI`u2H$4(3{>9-nY>!?njO$&D)|mT9nfk<#a;t zflqi}#5t&6B5zjnwsN`DmaSFiy$?J$5k&iWaO?reeqL+UQ5fl}5Zk7lu1Js--3_?* zD*0wZdlh~A#IBH1%d{ajm)NThGhsj-RkVwI1>vgXD+;+P@ejJHsMSs+q|H>Z1UD# zf-g;>jAG?wd)vM3Vr3s7YV%?x&2Hld5p)xvT0jFTp}{Kh1Zf3#u!=mv&meY?TZW`N zSS9}7CU5TL*iS+1P?hw-p(^Qv!%UC*;0V(r|7wKkU4Te|ioS+RYuBTi zZk+2&UeIKftmYL}hl*PBDWx~X^!|#{rj*{4(hI6(&JbBI;y3Nj%q0*r)A`-<;zC7YWWgTu3Elql&e1X{TTCi1ozdl z+n1}pWOwYL9ZV||1&kjb1(aj1XdKKjSM<%K9_1=m{U9v$`M~9>X}qMdHdlQ}gSCIX z+HQGmw|;H6T=j*>dojxB*LEvZOONW&TJ~ryd$g7VTFU{g<$%_5pjy7SG{E(x?=1~z zeFwCbgIe=}>Nh?Ni_}c%s1>Nb16*JFrqhttcYy0==}CPDs=tc0M6yT&TBCvLAAJ<` zU~Pw01|uqiQI)|!^(@Hh43s;nG8ktWTn*fi%3w%kFr+e=R2lT>C^T6u_I|RuG+rKZ zrTtFeWVMVClhrg56VIJq=DS#3ts-czmvE9C<@Qw7S7OEos8}uj!DQuOb8sRQxXH?6 z0a0vs^p&e{MhVujHuRGo_$t6H=bfoHD4j}jk|jxYyjd+sv-bUF?)x-`Hf!IX(z;D) zJ*JfV3GZ2G&0eq$Q(OjV-4vHWw!I}TeWoQYJ*6csJ*6csJtdeWmNl3qvI=I2go0V( zI|j4FJ|{Ita+cWB03z2Su*Y?XNfINGCk_uNv1adsg0}ku{Sooet7TWK5$Rdt z`KD*d8b#eK(F1E4R)N#ZEFCLm=~yvK#)?r-TA^WDl_Q?8J5IJ(l)avfi|XXF#){&+W5hR$iZ!dUR;HIW4y_EV9Ze z2kl%gjZs}H`(~Y6HS3J3S#OUv>rK(-VCARn7}Xpc`>@^DXx7`K&3b#ZIr!qFy<^fG z$nDYgSu&6BQCamW&w1rJubg%UH}u%KOJ^V}ZJoT&L|;+p48|U`bHq-)bK9x+YdiIR zZD&CDC3%%Iko&cbVbPbyu;@!;So-g(;J{VbJvbD;yvnahb2Mp=Ce4xOb? zJG34hT8|E`2WBzgitZ%@DbcHBO8Q_rC4DfRlAgCXRt1as6?iT!VaZXaIWn3fqdAsG z<%>4Uqx40a8}je-o~4rRHl|*{4%=p=YfQa&ojq&X zm^%MQ_DmpfkD$kL>~-$;USq0=c?!)D8&maJJ6mi_eGVho*%8c@c{lg3oP$mqRxF`( z&o8$#|E8487n)M!Nxv7dO)0VRjj5~e!CnRDpf9n}m!VoTM~miYnU>>yupo5)r7_hs zV9z$L@MRrolYTF^G4=ETmR?q6kky)JwdPr^IdHD#*_6~gtM$#M*0`IeS*>|CCH2j6 zed)YUt8(AU+~-iYR^>jc_06WFzHOSLO>?wO%OUm6YJIa>xAv5*`n9KI)vrAz)}kXt zbCO?xgO1c*^RO-eD5v_;#pTxR2y4dWz6-mLT`9S@*rgowq-YjRu^pU_?)rA5XiO%J z=tRY$O{@u{SMZb@~-sh zOJ}d4wBgj*knR+hEA2L%qS4;_3{KDU3}^>H$%u?cBie$aYH7yRZcM7(m{hxwjEK!n zM#N?(BVx0QTDPLgen4wkOq~cFB8eAMa-+GJk{iv%l-y`8rsPI*F(o&eiz&I$TujN0 z=3+{2G#68Mz*URKoBO4f)SPuGa$ud5NuUrf>5>T94}S0iJ-q@?ssIQSW>ebe&uaR5Cy(xh@y_c@G9>D4Zc~GSHfmA1WK&o5;R{+w*PqHPw6Y&$PvI2cvNa;1Y>h}LTO$%`RSC7KggUftttz1o zl~8Mq%m_MC0`*MGLDIMp<#wnvI#T~uX{FJsHE-3rwboGGu0q|~v~G=DqdTBsJ*gvH zjRv?z!=T)zHEPouwP}sowMOk)qjs%FJC{p(-_GTdMQ>7T(XOqZX{Ip&mXcCYHB zy-Pce*u0jT*K+e(ZeGjH*U0w|^2$M8%gAdP{YtN2>GdnU{u1Dbs%AxZ1VR8rj#KtdTiMu}0=3Q#CS! z9IcUk-3gs@j@HQj^i+*_8NqDv(t_FIr3JHPv`@~~QDe4_8nb28$Z1cmn=PY8PJ3fc zdt**}V@B!KE4>D#*Pv832Uj0t%vWK-H|rdBa}d47jz{);b2R2{4)*+^wE~+1y6f>R zPRV#lYRkvGna7nrUu|i3QorJKu|uu5mVvy0rG+IQ#wZ{?B1t zCH8UX9Bm;&U!LPrv6{|)$?o@{Y)=v;mSUE`v9zPz6_HWM3y&Xc`RiAydEo`HVRY`M zU!~TsQtMZ#WmRgeDz!G1TCdV;Q~C8OymVK8^{L3O_+t(-h`Z1n^-ugty zeL-N8_wsG%If&gHJd8P03iGQTl}4{hBd^lPs|@D@t8 ze4o0s^zQL#-}n$eCy0ul6GX+&$tdM|rQD#DGfKHZDQBWWFQfD_O0O|3-tegQsN!r{ zNodm8WLnM`wkXc7K>pwa_-4vgt8&$*T(v1L?V7hkp`1cp3iYJL0{5oH0_QchU!j6R z#fY3fSsEwbmc9@+z_GlJ#1LuSka9Y#oQ^1`?JB>K63;5Xc9mbd%C9rL>3(ZFN4X5r zrg7zJQtMGH)q}rzLAGv6c?sr-mL%thmh>wx$vL7W={cfTb($liIWn4VG%aT|`<45C z<-T9JuUC2vO0QArH7dOgI{x;BpM|yE?__wJnzu#sW;JhC^WGAE{+n3wLXKO)XW{Pa zNk27oFm_1IXps^CI_BZ z^VenXM!KOnVxNcR&|H^J5)I9fo7up*a{zU5`Rc*Y9I@0xbI4ND-TL7mdk}1KAEomi7&qp7fL7{nMvTUf8^!mkfa}#Z@74CrYy09}`Hgm#ke(~O zHa(YmEvty5)uVOm)w<=iZh5WIs!$7h3d{lS zILS%bRU!HM{HlsAbpDTS&ll#(Irzc3df#-e+;^E&Tv2gTiVNmRy5v0R zJsCb>MYE!`;(GW#4&mw)mrfNeAZRtU6=|OGjL2c<)rP8WYa+)`% zd2^aKr+M4vNndTBCw;YJp7hl&rP47^`f8Wb>r#4MN^e~IM^5Q=mFOvzA)VI-%0Z9j z=+zv(nj^2ZY|~l}=p4IW^A4K9csC@c>DY}R(8&WXQa32Mz!YS3Qa0hoG0G@)I9P2gZa`wx}&r4 z{oS6k=)4M@O}Pb7a=x^AdcL%I-F#{Dy7|)5nfbJaLNmF{d@AFLU0_e~DkwCdoDM4GA&nhYPDhl}QRQ@0IUQF{$CcAbrB_sX zMdfr-IUQF{vq>3Evq>2_vq>2_vq>2_J2YK~rt8pj9hz=xzSz2{`Q+!&ow%v_auaT9 zzO33$%_mz&r_842ldYpQbGuSWD{?`t*uS8bsBAc!a6&oBIJ&u(td+B6$y(W?O4iC* zuw<>CLsoie&ilWhmsWapO0Q0-)M?&~rpsu$jHb)fiszQmGU_!)z2>Ob9QDd`y>eQw zRO*#VgHmZwDh-;qp;lztP%AQRPtPf6#oh__H%`Dn-O0aAL^sGb=smAYrQE_E(^d8{Jt;P( zUsWCp4!{|kS?JSad;%;CXc>PUVHGH6D&e^k(gVEcdz#_XoQoVP-8PkOyGplRCE294Y^#)+*F;3l`ZX!{ z_V)w!?Ua23@((t~idc`e-wlX8Xum_yQA<|&Wu&XsFLc&M<$io^^f26$BU#l(Z~K*9 zovDrf?~e8t25X}oKeD?)n{};fb3*RSZ%$OAeJJnd#A1c~qXl=2Hq!p!}S{eO% zYh`50aV*UU@|w>2)Fh!%)t8jELMkdJ@c}(-rIw0*(zQaaR=ody)trKA&VXvpfNIXV zK)&WTsyaEUIytI3ImrC+x~)~tvd9aGC)T>{C|Ey(<>m8U)-ZQ8x+1(LNN9zpZ zdOKuX@6U{KES+IaR?F`!r}ew%Qyk0ZhO5KR<5URdgGs%)k*t>6I)R>q&ZVSRjB-6l z??-ECmbx)VP%I8A3@rroH$das9*wD;p#yXxrHRiJ&H5^xk$V9i2Ax}KVO$GvlS+A# zDSwG^LV2=QC})*ktI}&zdTmOtUC+)Gm6vuso6@dlQ`+@xN*Cv)(;az*rg&GCG;Fj+ zEa6m*XvvheWw1c3cXEMP@8klp)DwDkb+kq-VK7^)Suk6ySuk6ySuk6y+2|aaP0*Ja zM|EYaUT2Hx1@fJ&^n&*tXIE^}3;NLq>C9Mq!7nf-U-dQ2j~2*`FSCGb(|y3D7hFDI z*Hr5k$egZjfy@Hy7Kl$+$2q9Y10Ih^uhI%-7TohQ?1G*LE5G0)$4j~N>rM0iFq#}jG6tt_phX|$*bq^U~f-^zG?PmW33}*TD*N2zr_1Ehgolbgf-?!m+u(w zAbwx!-dnvx`2BeIev)?>=WFw_9G>ni<@n_;zTG>4-_LOGXL+aa`wI8o;hoO;&h^gV zFz0=Nw!Yv$DnOXiy z(5u4llRtqlhF>BldDWO5IEZPITiR^eBPzJ&ZS{KAmsXDx>@ zb9b2fTa8)g-Uq|BpWWx)9}HW2^<$TBgToKIe2=^Lr(C{`F5Q?5H@nb_*m6@Y+{uMI zyKrw8E^^^PE^Kz;p)Neqg-cy{ybI58;R+Y7bm0XYR^gXQ?n3>m%;k}wi^ASWHHTM5 z<|C{zeJ))-vXI}eaqrhf_QAVvR!7KwSK*w>ft>GVm%k8M!tZxPPULVPau&iGv)1Lm zJ90k1uj6;$+{bik%tn5%F+X$oO%DHx!*6!@KRSFo>iQvvKE5Ad`8haxDbsIeJjR#k zYJNY|y)TJcyKuOB&qhg)V&<6WjYtCt=meYtyY z=X^D$lizD_v(56?=fYcDc%KV5x^T>eFS>BTg7dE@_P!3~e zNsRQg#vJbO%UpP>3zxfag$vJiVW$f(aACI#FLB{DE?n)x8(es+3)i@Ctqa$?@DUeo zaN#BwKIg(Q4rBNtHjV%AAL0){zEvg}{|Se);;(R+j>j$_{QUS%2r>S}NiH#So(sF; zcD%g6g%`)E|HklbWZQ2qk6ZiE%jLw(w>e#nxq<+fvml~<<1%4^pOE3f(rYL}S#P=)o!R=Rw7 z7hcEtYs_l*-tXw#?C2C6ojV+z0j2|cTVegV=Qv-D8FS$)E<8MG<-OE}$Gh-U7oN?b zZ#t9I|7*-8?tPVezs9Az#f58Kc%KW`yKu~fe{|vEN?YzhE^Kz;p)Ne$h09#{Z4NQ6 zR36Owc}L|191c|8%zC=k#ot}|2;&DU|ChrDD?fN4@x9)~4^ZY;G#3;8`N{)19Iw0-A^c58@8!y;`F+B@QHuAK|cA zc`%2sS02sbRAn27rs|6b;g?idIULF1|3lT?$7zz?b=^Oe?tz_z>~3}wV1Cd|aRCVst+IQ7VT~BpfC!N)xf_shS! z*YB5~yVvd)z3#v7Z>#_F!#(%?v)F#peJ5(qh5PS&Uu<7|-_NVn{dV8`WBcj%{X4bi z!|J|Yi~rudZ;I{b-RJYa>OPC`?0vs@5e7o{k|ggdwuHnRjJ?CrheaW zpWnCDeRkj86L#;j`|Y0a4`cra!re5_J@@;5Kk0to@BR1teqWXHFHHFtr@Xk|*Ry@U zujeaLzt^XJUzPfOZR+<8sb6)!uV?puThH^umHQu#kI!$u-ya88<2(<97rn^O`zurX z>ePNLwb=t+KbP9`vDN#B)UF=z{$H5- ze{t-u_iqpQ@ohig>;AF_{5*ce1AZRAD$Vn?Y5X^&@w+Mi=9KHF__cpM&&K?L@Xpj; zdeD#KYHaTf-Gg^@A3P8~obr#x_8$ENqpw4MASRx#dtRKb*Ng2q9|$i@|Gxjle!MS! zu^sON;h~s6FI;@F-G>i^hvUB=2$xcOHMMU`?O#ppld1hsYO|N5^PSq4r1sURy`0*s zseM~&e<-z2ruJj0ec>njd=IDg4XJ%&YTp#wd%|~qvK`;O;cfa^8C(CgRR5vWKAGAv zwYO4xJGFCaKa$$^Q+&VIQ+w%C{oj{U+s5{u@VbXAzbCvgw$BfDAM*S3L-F6bKB;}( z@A2_(No||jcc%7kYCn|P52yAcsr_hbKbG1HpXT$uI<>D!?dwwehSXk3?bXz_slArk zF}1&x+B>Pe8{2!r3qRfW^P<$gB()EvHc#!VQ~R3KUP^79+P9^)P3;e*_U);CGPUnX z?U>r^rN003slAZei>ZB0YTuCBE2+Jj+Bc{6snotJweL>t$5NZU%=h!Q)V8U8-Di0I zrqtG{eM@TJn%Zlry`I_|slA!ncc=C}seONHe<`)u%J%cTaBk&~zw`0m4}@2y_SLDq zl-kRweS2!3Ozk^U`&4T4+}D30wXaF-Yg5~%_U);CGPUnWZJ*j3slA!ncc%8K)V?dV z?@sOeQv3eY{!(gxCAA+&?VQ>>slA)p52g0Qsr^W5KbqQ)rS|-1`tiLmwJ%BSL#cgf zYA>et;ncn|wXaQWnc7RKy`0+DrS^@feN$?$r1olR-<;aFrnXJ(wbWiu?b}oPWNP1$ z+CH^6Qu|bD-<8^Tr}jOmy_MSAseNB+-yhq1!-qc8o(JyVhaBAO{+BUUs-SmFnnc62)d*MPFpW4@?_N!C-#?-z!wQr5>z2WT_Y+d(; zCsX^5)b^>p5!-vhQx`rzzD|9~XZe2K8ryrq&D6d#w)cjoKFjBOS8VlpM9SZn{{1WQ z-w%Wjr1nl~KN8z}!nx1(`CpRShf@2})aI#uWoloY+SjD^wW)nwYTusP8>xMFYHy|X zeX0F$YTxuZzW?{6_Kg?)-)~CoTT=Vh)P84b-N>3ho$zzssBe(`_YttEVVCug&n6p z-*|-`kB%$0_k@RH{`_$H75;Vkb@AVNzn|K#PVF00`=;2wAk?YD6Ot5f@(seM~&+tgl5 z?e)|?^m~2&JhczU_TKO&egDHAe|2p2J}}kKeO~IH+KaFBe?OJlH$3A1e&`FV%{9jp z;b-*Q)An$EZ}`a{)&KQK+6#8|Ourglp`Utrx%5o9rGB=%7sRUR!SI29ub9|zRRNT!b?6jmway)`$y|kJyraG1xgZdA1#8$8m}5QL;+%W80B@ ztjWh-L61k-%#GwD_9P!+@)6fiN55Y3)gMT|7|*H6N8CVzl&*~ABaS5>af^O4)zetD zRhfLgvnV^>J7n4Omig8spU>nY&Y_%s8}u`IzYFN1%|uX#)IeVBagCG=>N zt+|qXY%TfN9m&U9&$ms#OJt9d)spXHM@o+r`dvYfN7#pQT3!l8-g{*qf5?kuk2U$&eaX+pHL_0fu{}DZ-;JoB(%t^F^xpVPJE70=Rd zqB^5H^m~qe`j9iNAVX`CuioUVH~m_CMRAVoe3ace52BTnt{d8rd_I%Uw<-DAxIp$u zl+9O2K1+$VB_DAq_Os)CG|EO)^sCX1l&)axXCtnl$D?d)L%&w?{qB)ni~Vfu6Hzvz zquNV8;(+W%>}MmMjh$7CiyFSny?#Ixv>ekSjCM|vh4Yah?iFMPr>bB5NW zbS)(xdro>L{Jh3K7&F`3O7d0ZXhTZZE%vh`x_};uvayBaV@q^N@_kffHQJHVm63c^ zSJ2~8HghBS%q`lJe5}dGUPDhr+1O6@U z*&zAeMszIsEGD1DMGwY+D zG&VzPl8-g{*mLN?C>y(ye7_r#k1+X&3+Rz38&OC;VoUN7CLgg)ze{9~l2wwAtk z>4V{aYv$cpwVAKb?w7sH1A~u{}DVYVxr+&_KTt9ZS9zlaIKC zo{h5Om?YoZspKO}KH`ji&mn!&GL2Z1e1yqItVh|*=g1x;TS>mR4avuveC!2uG0J9n z1Z_z^!sH_^p-S?Zcj#yGepk@dD4V&Fe8isQGn;(GHFQ17UKe+gk2sKggvm!7M%m0a z$Og$r97{gJAUGkM~P&IjVGsM zKDmumo5kcK_Q|eA*=y0B>Vf1dHThZ&C12?cvN6hLHu=oQl8-g{*c1BQBD+mCN7)gX ze3nzmXSoxrwmyBZo~jvIlf2(K$@jLRnxhT+nY`ZxRM2mWekSjC30;;><0rzEN>oJu~zffRIT$G)wOusqgv#d!zi^*p>hjRLD#>~cE zpjuMhl6)4E&vFUX^xL7I$@}d_+06F)OrAB8ukRXJN7kboR0pyV9ZTu#((fe7_I8VG zl6-G7RZ}|8(hK76YTSv{`0S%!EAwiG&Pl%d71;%{N1|-M1=SL5N$LE>ezuQG=yH^e zeH2xaKgvwLmKyC)HTkNppvR+ZzJ`7#pJgv*_6Rlk*lXyCC>z^JKH@;~)th|84fJ%B zjTj^!aV(`PL%&<-*(e(^Nj~CK@)0KA#~JlA8{c0{bKSFhxEHa_B7cb`PgI0_h$03C-l2T_AJ>X`Pe&DpQEZDR!h}2 z$ya6ana`mIqwF|V^fUR)IogQT_%%iHSuFEsLeqoUE7!BI8LKwm1^PWgR!F`UlkcNM zTd`{UF!?^VC4Uw4Xv}QpTJo_wQo5?KYLDqFsG(nr_9S0{$@g&$JrNbJs^t6V(ShW9 zGx^xVC>wEu>}j$=@>xc7ETt?@M zr?DAYlYFen$DTtg`sHXt@)0HAXO;TJ*{cBq(VpfqJCiK9N7l_Oy2JTDx+*4 zTl6z|ziq0Q$ad&w@_r_N^{^}XSHCM%_ar~3CLeJP^^%V;`IR}4(p^VC%X}Y)(lepd zQQn|BM%i(g(w!)!JCT03&`iHm`k8!vru5EGdN8Z?dgv@xZ69~&mp!!XZB6pMnS2)0 zPWIy(yDs@ro}+p`%I3=@U-O3KvzUCA3+STc&rPM|BeoT>zT{W+8rAEPf9BRnK3^ZJwt|D0*?cCS&*bynAiF7@ z2K$P5EcvmSe1yqIoW#s#zD4!6v&?5Xi7}lYE59_i+y8^t(V-l5I&o z_7c^a>JHT_RIf(a6>RBujcQMJAo3P^-b%@5-jaM~laJVrvNc~K+l{i7ULk9wqwv|ks;|zH z&tmdf?Ek-&o~5XsQVpN6RM$REK6WE!wl|Y!7bX7+X7aCKTlBjetM+}I9Ws-Ty&9|M zepxG}YVzv!She>(2UJa7y&0?aZs(Y)$*ZSiCeO0fa(36GbloJc=2SPRn!IZIV7RGQ zb0&WV-i%c{8(UJkS~0VCz1viGsG5Afy_ngxG3^V8VRvNNh7x9X3px+bL~mwc8DGLvUpWG2sc$V{H?M%k)b$ydK0Gh0DVHlo|H zY9pRSGu7wFvd>)RTa)~bHTixYjIvpB`fbF1wqKL?dxU=F$0!tKamVCa0 z*w3CBMykhDO+Mdk$)8V6=`$$F=R1{rK9i3yy&!&8byxED0ojFR#F~`OkmMuQqwL7f zOa4kfm;CjM$@jJ)`B;;Wy%=T3Yw}n1k5Db8^eRa5S+*pf#pJVGmi%>lO}`y=PIYVfiA|XeJy)L^3PODs$0@8 z#-Dk=9Q)aC);&tU`s3tBzN5^wOZBSc_eM)~5A93Ogx}Q6*JD5Xn%qgxhA+2sO1}ei zGxoE!jAX~?cC5xTNp_0PB;VWJ*w1FkK6_d78d{h9ZaOdd>T}7@&<6cB$u7ozw)#iN z3dxV7l+rzkE=zu89+iCN8tu^UYV2p%s3qG&*JIW0*e4{P<$&tVShb^kn(8st6UmSA zcI;cv=%_ZrnLs+VKcj^k0PJ5;a6 zsy*@^r@BY=daT+f!cR~=pn53zQQnOG>?cx=sh&u_(%Z3WpZ-2ec1pjyv1(`1`?yPL=KJBgV++un}-?Ceg`QTSOsE@%3kqPwx5on89{+oSM*)Gw3# zzF$MC%e;Y)vADuQBRfFH=oDq2yNp6etYN%>8In@Jd^M3 zfa+n)Y#&e4@0jX|g36+BM0 zk&ePO-D`XF+o$>j>SDj2QNNyk2k7b8&(8f2`#qKa;?{Oadq8>ou9EGM9iT(1 z1KEg<(Fy$~vKgJCGx~)`maAa$vzDPXbYAl3rWIK(`SF^3>;}3h`G`VFSDI>xwon!O z#bTNVrJw@5)FDqR`Iod!a+CrBlUqMZ_gBsML zJ+v>S`-QAW2eE2b;gEg<)e#+|3C-vfg)dl+GDB-9M;oX>CE7wY+CjULA5lxThxV!V zWCv(O$7n{UDEq?YIMz^(Hc){|w1u`MUuh-z^M=VE-8I@lyONJ+$Xc|AdUSveC4U5r zWXEVmrzpH;Sxbi2&f1C?kCZA-p_nrsKPXb<)10FCGv&FB*D zYzH-H4|V7O4d@u1NIvsKc8bCma~x=eHY9&lRgjf2vuE@zvTd@8YzH-H4|V7O4d@u1 zNNM$CrzpI3S$!sXzcsS+l7HWRMYe$oRH7}kEv4&0R-+x%qCM219vw)2CQbf5hk@#d zj?rz&@0W>eMyKdZ@|A`^xSWkOv_c!GKwGFnJE%c>XkYTZbz}!(B>8K? zQ>tf@uX(Ll&cV9mv#iK+w1Em#qAj#7`KRnP*$!$X{|aVGuTRk)+LwHmp6mdP=ornC zul|%QE0=6d^1bC~1C?kC)o4fZ$4nb#S8$K4kFq<$JHkKdo06|!i)@>IJ7g`|Lp?e` zH>LC{m+Tmw#Hu}JX0lUsCiz;jKfD~r8d{fp^*PxFD$y3&L3`)`9ivkezHHfVhSt!A z&)6eAnPSM@i&%UR$_D7cL zdC7k|bw##;F2<^T|EM6_LYHIJzH3xT>AfG-9dtGJv+o);^fRS%g|5eb_T9MyvO_7I zjaaqs8XZ$Tp?W)3?JvL1R8P^}She5V&c1xv?;6U{hU9l=Dfxa)zS1pJQ#E;Y2klDf zjv(7Z*CoG)I%f52ywl(6_e*5V9$LX=G(}<1{H>Jn2 zpHw!G-HzFNl}%)KWA-b`!W&q<g`yyLWSbe$H7ycOM z0G*c}%f3L>66!3S>1yovr1~}VyB@Q@udE~MC7=0btj0T=>g|}tJDcpTSaWR&P(3U^jH=?QLCq#ql>X>*S8=m(dAfufyP#3HQJSY zA6H{Po28|?PxX3~eFk89Ec;Z=*VFHiem7&)W*H^_Owg3hMy%SsHj~|rnVs?MYiz`; zb(gG5>BuF&Zo6bX8qodp7HT+-A0S<-3y4yiYcMoP4G0U%T|%M*FCfyx)K( z6yCU0E7VCx;h+BpeTG6d#O(hl8_6a#Oa7Y1uQH2_GU3xaW zLRYmT8_;>@Gqf(HGenl70+pyjHQJSYmWHfF z9qQ45Ml_)rok?l+6{|<*C4Vnu@}I(7QN0+e_O8g})q?8fShe>;71`C8*?TpUk7%e~ zk5zk*WAf_FnAy*PnmoH5Gkec|SMt@H{5L?eddbd9={Gwie++I?y%?+ZUc8`sIcD|_ z{A!fF+ioR)uDc#HdyhRxN8z>qQO}N&|JLOcvu{u2b#EdUQy2AREzyW^^W{Bl^Z=Eg4#uyt*RGQ6c%) zMw73!L=~#huH^GIWG(8^fJQW-8HI0J_M4$~$?x`@tUx8I(N)Rs?3S!UJvx+p=8^1# zY$iJ+%f5M8Uye#tqeeOkzpUqtmTX`0bJdd#vEL_8dLAM>q2Cm%U!&?wHC(ls->xi^ z{2Hxd_H)W|vJ%y(iT&=GwJNfG$mYYqJ7C%)sgjRM3dx?vY9OV)2s@WsFIGtfsV44d>BWN3wQ$@`gnr3ETcg&NeML&;}Z|1*ouN7)e- zlFz(NwUUm)M|7?_s)tkuvI*UdRhw`1t;>9ylJB=5Yow#_C8wG>>aR#c)UQiZ)MuP& zmOpF#zFEqpbmTD`m6ejuZ1QT2TGUBL;rt!l*<>S{QTCQ)K9kRvql;8avTe!l_L{6k zJsQ!3W)!|{*;|HIC`To#q@(b99Z^lzq8=SeeuhS}8J$th9$!|lLOCj=qwqJhx00+z zS0&#^L)M}W_4G6O*&QT*{F*!)(TuV`w^UasM+GWTg=%zFN-HI6(RHdFSx;t4Yepkg zlUHw(&1BhImuikKN`B{*l7EFY`7D>I)?`;>W`Dn~A!|{GdNiOBO(=Z(vbT$ppO=EH zLJewBhk7)i5lv`D;X9W7W@v?Sv?-QIjcG@=QGw=Jv6(Wc~Qw=aDy4KS z$tqM+HTff@K^+>3n21~ei4uWi!`R;WPRk{?G!R-*>Bs6#y((S&9c z_Lmi8XoYfApb}N6K^^MRfJQW-aBW$^3KghA4eHQ^PwCSs6-X2QG;64qY=$0 z`^(FIb5ux2;XCvUQbj#2t$*M0T3{1ZQo0jSi#pV!5lv`D;rcRPhE^y?1u9X6YRT_E zQ(7Nt(Z1xbZaT@oGv8A^q&kw#DEt0p<`UJYMLinPEct#-zP{`SmdxZ?j!IOc7WHUE zCz79oSxS4On*Eg}Go`(u64jEw>N9!27WHWLSMB`SYld9%{T7msD9I|anrx7K>@4|8 zv%j{?Qc6BcC8eLtBx_NRMl_@B2bWn^D3^StCf`SaN>rg5HK;`$>d}BkG)d`r$<8ES zOZe-{S~9dkIVw>&XT(lb?eLRX?<34eHQ3n2 z2Gl-b^V!{G@>TU{L^I0%=F)G4a#WxaRj5V{YEg%JG@ubpXhz}f%c?T8LOI%$(qo3K zL=~!0gId&~9t~(j6PhL8ugTAI_~Atv%BA#3AuGvDKDI(NYEX+h)T057lJCuw?nyMG z@VAy~hE^y?C8|-2dNfE!;lJrC-AFdY?DzkcKIJ6K{`Rup9F?d>E$St|pG|&5Bbrh6 z30qRW(_QdNiULWq)VcM=trQOunkknAxX;h2-zmDylWrhO9*$>SI59 z{F;2`0gY%vGYUVl?APRDGqj>=@@kF>swS_NXj}68s-mCC`_-sLJ({E!_+Q5-3qQJK zt>m-xXpsDGFpXrhlpb$n;T=oAZOOm-?V^2jh*m$g?5#i*YEXxIG@uF1lE0%5KfcVo zLItW&gF4B-&Y1ih3}hzHLbqJim2?zt>E11(*6->yX4ICnEBP7fVs=g05cLbvDEWL- z%pUsBdR&ra{Zd__92KZUmE@~8`OGzHQ5XB!qr&uQ@h|K5R0lMo3C$?`iRIW#zPB6| zl0V)`vKlq0MIGwVfJQW-8D$5oMM`TS%gF|mA1)(IKB7c5Y9+smP2R63GkG?~%swYH zc{Zc$#**czL^Wz8zk(*8rIq|1GI`da0Zo#R4S#nz_nG7)RwzdWDp7@M)JT3UO=(rA zN3-Owo3g*RC`W~q?g+9<^7(4AUCGaQL$#&ak@aMQyE$Suzi-9Juj%Y^V<}!08dA}7|PFA8CwWyPPeLdMgHj>RK`v=S3a#W%k zwWvoUno)Mde5gd*QT7Z{leMTvBbp>XqM0oG!zIh4bgsy9vJ%y(MLinPEIkuy{gg`f zPG**T1vyzkR+4Q;#bYCDQIBS{`bW$x`Ee9v6{@MWs7Ire?pU(yA20Le(lg;(bwp*< zcS$vBBtN#6tRw5mMl_@BpDg<*Q6;7Mq-TQdtw$sMW|Td(%#x!L)u=^18qtjMpIr7^ zN`6jj)KcxyNcALU_VcVW*;$lb)$HkIzFhJ%UZR?6i+VK2e&1*J)jwTkSxHCX>VMW} z1!N`Kmi%{QYnNUrwNb}XPrngO(oy)wnr|k{-?i+mL^Wz9KaNh)YkrM2`4t?{DEXN@ zk^DJ!qB_Uy*R`tf|14uO$w%a9Q}VF|{Yt9aQSs43)<{R;3qGhLCmSVSbN2t5?3}Jk z{*`Ve`R7-r^r($h`+4O}`juoA{c5s?td)FkgQQOawU&{7Q_S9_Y^GoMDeLz?lx32S z&7=ONR$55Ds*-9&R+BYk9qMD%W;yhJx=#nHqvU6NBAdORjy!w!vX(+hE0BCdMOM?V zA#2GxvYu=p8)MdMeKXbUrN{ zN8zpN*GfL$h)%qp&e|0Fy-WS_pIQ19(nj`wm6c?b6!3TKdQ$E*(muwW)$AD z+<&HY|4BZ!mV87TGkeVRWFwkU_Rp6Qx#UM)leMTvBg*~-W2I+;J#W-xE$Y#TvVpOv zMy-^t0$DaP0+pze{A|=@4OvUpN$GtQ)n4+w4P+CVB|oQX(mpcDvm9+k+4D<5ziqNn z@_kHH=UBDp4Si#KnOX9gOUXy{WFwlSqj32{`so^^(srqKWEE7JiofN@>4jIa!Hn z)X=Xb>&SYtfovq3B|k6Ozhu8sdW50^m8e3sD;3d)u@sDJa?$4dMNqt`wdh_s&lN` zvwZ$@%ic<~jcU}R5zXjK^1Ws6TkhwTlKB*$&y=p4O|G#S9+!zesx((Ciy;AWI0(uR+3d@yD_u~DVHe{{j zXQ(5y-w5WSp%Wg?qnzxXcjKP@w7lAo8A(LIp^maHS|C12@4Hj8z2JWEEL0`PFL3I@HIiosEHP zLUXLzBRTvgYmw3!BFo7NvQqN>R%8w8C7)#=8_6cJS@K!JZ?OW&&(*r*ujW=%x5+B9 zI%e^89a&4(k@aK)*+@2#&1B&&tCIYPHlys(SWqpgZd0wO)>67gWNqwcYwpN;`VC|! zv7ha2A`Aa{S=9JEQtikFG)n$i?nD+o z#C}nMD%42n*@A3e^0U@aHTjYElCS(GEk`b}hKl7B)F{`<0zO!BL+E_roDHK$sTm9d|_ma5Ud>?~$> z$AR7>fZRq|Jd4b_g!xGp>?2DxN1KvYOR^g6 zM%haDW54*h3e`ihk!+5cU9IeQmc6YcUtfVLR7?J-F!}0tC0|ub)=5X<7xic#qVCnB zZj^ki$;X~Z{+FS$|G896UM*3LdNfGB(vj>W%I>C_Ec;)}d^Kt$AKQ|3WCI$hPGmD# z_~L9p3RaTOoJ+of%~-XWOR{ar=c}oj z(iM!Ey?*J@h-Q?1jQvXfbucH}jEegu+m_OP$r{PmY&r_B)1BQ??a?6l`bM&oDBH(O zb|(2g!v9%Tl}UadtjKb*64jD_HEqfEqvDm3dKXtM^rqQRCB5&+Lrv;tf5~UGkfo{AN$3#OZ6~T2ay=UL1wLuE%*M`99XA^jDUo^jt!E{PqY=$0yT|rspAf7hUtccy%mrD6YN`!cOSUih>N~23WCPiRX36(<78PH!o?q6I zNnTx%&d*&ViezFprxt?Qdh>Ab}3AJ{b~t77)w zlr>SW(d+##>U*Ur>K7#aFLpHFC+oF+CZ%JGnY|mx$%>dADJ#jEnEkG@R(dA9SJ$nJ z*=zNBzo*|AtM&?Xiq-E^b&gs5Ea;PL1@BXqNxp)0$sawdSbecxz2{WRShb&$s-tX{ z-B`7&)spR#jWM(JO_JYNbFA9)X?Wq1Wl}l^WV!TA_<4;j$V&QEWOeLkN7;~dXh5Un z`Ur#njN8#&rCytVy zRW#p>!i$#uW|E(m^{Ds?o@!2YlWIY=q*{^HWDQwM){*sO1KB90l~TJL88@b`A!rBh`s)mVCbO;IgW9$v@9tkrk+nRoh2J zR!crhL)M{Q@?$%UimwHzj#N*gY|RtZnd%wU@Zx2qnUo$2WI0(uR+3d@4QeG{eMdH+ zQSyCEWHVWK32TwkTBP)e7uB3_Q1fkxA*?ljURuStT6d{ia@nwDjxIAo)2RW54*7UGkYHswaqN;(Sv zU0E*qPwx~l`$B!rSJJPFS);5bYo+wNGEsI8vX?D0=aPTUP?FWCrP@jU$*0M$U>~dT zK8V%$+(~st;WL&InUp>QC0n5aRj8Ky3N~ad*+4d-uwrjgdR&s_WEEM1I@Hr|Ae+!k zHOtwDPu_WI0(uR+3d@ zHCZG1`b_ESOMZ_JWTTW;N;b!S_6bYaSjJ{jS`}GNR*;os6eq|>+A)CnN znAu}6Y_b-~&)WvqqMa6=Wq@MOKqFWF6|M4rC+QL>4}awMgl#krk33rOA)7mVC`Eno;)IOLZmr z*qp48e3p`|qMymDyRmBLua(kc;d7Si3KghA4eHQOgKxvx9sK1apb5( zE$Y#TvR5o)OH@n#tlX20Xp;O~&1B(om-VesF8R4H$STyJmVO;sFZl`v$shYBKjRab z$+KDVy=4zC%2ACb=_ve5eT_PcnO(Qd-)kdGmE`kv(ouL&-$m-lMl{9h*Qq*_WxsD3 zo1+rds70Nmze8{PARA(KrfejeV)i-uzSB$=K5scMndEC;Nk`$&s$VYo*(gyJt3Rn~ zP1eNhL&{pRE@ltwdr>{vq2#XwN3tpQ`!@BP$-*mb1y3or4b_%vN7j=KWFy&0l+7|xovCKOe_3CSN>oW{Rb&lWOV*L~WCPhqHj&L_;gRJE zntX4WvM*pCXfw*zQj%4YpEZ-8mzrur)#TNdYDdFWF=WeR+BYkEm=p_ zlO0OFmVxSoX8MIcz^Wv_Mk}&hO6#LqP%Wv}sG(m=)=5X&SYt5lvKQ$yXY-mwjZCXSw88x}aK;)u^G`k_}`d z*^I&^_9pp0R%AI@DfwDz)Kcxyh-P#a70>CHF8j#QrsO{pSV!4+&RVKH8mZ1?*&kl! zE77*(uSILJU9y&JpRAMg|0vM2<008dzZqp;ww!~NbQFGABZ{ay_RK1!MLJw=G|_LS-x<~H^0K#FN>?T-oaWwxg_COTOP0jp&4aljP6dbIjs%=a(-tuOzSLWEEL0`KN;|)%_@2K}Wxy>L~e$ zlPLS1^+dm!erHs(uUOWyF8MWDNxrI0vWl#h{QR}3quP^=lE22BsAjKQ#;&Avx~Z)jyNo8{e;Hf0VsRX>Vku}pk#-}g1uUCDnos*%zw56R~{jIyz#K$CmXK zl8-IPwk5y%71f$*M|McRf$A7DdxV}yeq|=AGu1Py;n8I+ndIkrMYbvVEG5+%wP>Gy zo#aQkeaPcl#ju%wx># zTuo%NI?Wp*emi%n&lC|{PC+j4CL=EVSYWB6u-d0k&Ze#^ng=(t1QMQ(bYD=}3{A>(V zXR6g3m*>PFm3sFZw`imWB;$a=C#@@M7j>zA=B$+KH!4V_UKz zX3r=a$-d|TYtep`9a~4gUh-9q^qZ)z zcG#QbU(3oUd$z5p)?_W}sP<%|=Q#dX)W)a4Gq<+>V)zs3d=U)Kpv4Nk`!&`bqkpY(z84zH!;xN;(REStClaO7i2~ zkD0BdBkLt!)flVxo%ES3`=+H@N`AaO*@$MU;hSv*AJYml$w%ap@1sOD)fUZEv#ZO9 zm6X0#kZnu;N}-}!Q{AQ7P;II1Q$0ij{U$U^zUJ&(7OkYT7P5k@l>B(NqwM;&^xKb$ zkA1R3vO)4|G*X=<_SU7otVbP-u8`F^)!H9o6Q-6doefP9z)AB>B0T$--NfER%ffy7b=o{&z*SKozQEKfCL8qwMN8R9mV&8mP`>XOiEO z;oEowNPZ@B$yZfS-Hw@EkA|$3e8fODlFgFO5*}wCQrZV9CGS^Bey(b&4OvUpkxi06 z)67(}Key~-9Tk$#T%iW-Oa3>%JF)?dlCOCpo5{jkmzguk`>n`wNynz=rh=^WOjocX z>m)yp31#2D%$K85@^jUa_2@8GSLgH-e)OBEo<-R!(Dm=IS*%|!`I>9g$EtlMGm>S0 ze(9G>zJfyXb6UnM-W!r1$AC^Gzq70Fq$>H?@E4ZnoR#FCRy0v|k9TN7tM6LI7HC`Y z-_|zy`Z}r;3g5kqU7-ebXh4T=TaJ8?{Mb&&&QSP^OLblHbGnHNs@r6{sG+(~c8CV5 zCuC6SvoXHK6Z6|Q6u^KIy9j0{Z_TdY9;yDeaTmKh=$nD9w{ee6WJNr`VTB)SCY@S zNw$r4(LOpvgOttz*%_+-%2M6@Ys=oYQ6r`M08J?T;8HD6g*r5#@Yk0SD^#HdO;UQM z`JqKCRGS-T(S!7O1{2*)KNVlo5;?{*8k2jb|v}V zD%7C~t$u`ls6!JfesnpaM)H{tC12?Yn&@{%w*HQ#-%9ean`GOlqS~PosuS7j$L#CJ zKhoEaZAo8~_1bYi%3gVNvHE;vCz7x446Xn8lC31aMw?{YsFHl8yJQ{Nq2xase}X2e zXOi!Cy<4=Be7iB@PHa$z4(WFy`S}Y!!7P$z z1=)#|-a{PFPfD-8$U1ZqtM>I{B0D3i4wqRvG@&!ek7IRX>9;ARV&U|2UCv~M z8q}fi_m+MuRGPS7OzSzG@n%gie&9S7Mqs;KUgb&}6AQC&T?%u=Ba z9ZG&2CupL2Mz;QwOTR)&*H`lO?Nc4drr0mOS9^LHyNPzA>?`ph*$J8?pZSbz{huzg ztfX{a$hOfg+DDz_Yd$19L6hY3g?Cv$Tl4-;+1_k@`|n=%dx%cZ8Cw78rQasnM!RSq zouD(c`OlVFw$VO1L?`GBt^W*T(JtD24^^~}?g^g|zUce)K1q*Yy=T>bKS^!NpnLim(V2;mWJU#ab7pBTcw)i!H; z!95|oT-%pu`&Mn=qwQz4eN@}a&xi1(+I~#iN3?za^L1BfJJB|2`?i;X?x_;LfF#wc5P?cKI7B%b648F zO50U!PigxdZ7+DK&WX0K)Ao(pzDwJ0YWp2+uYZ~Tt!>oyzqGyhGeUTSwr|w-z1n_E z+fQrzciPrg+NZX!)bwf#?RpOou+h}vGItYE z^F8ReCFKk+~wSR?)~2H7c7VEa0E`k1^5P96ldAc1=3*(%!Pe$ z46ec75K)3{0+nGroQEs$2Q<2$;~o~kaySm>;4=ILc}ue2pcZt76v%{eFay@YJ~$0m z;TK4GfCm-u9J~jI;Ve8*N{H&v42Hvb_yt61mH`!@HZ+6w(8b9Q3h^eiE5q>tNo9rT z58EJAPKY>o8m7T-kgvQDtzk55h6;()8^*z2xDJsOXe%%s7Q;y>oDm2{0??a+7y(9zv1gzLi`NHYIDrM zlQ10?z$N$wZo|EGgs2G*Lk28{_u)f00w>@Cd|g&L=Ph-hgWm+mv${JPdzB+lSa6@B?gYCd7*7jMGAh4)8Q=hfquQ6P$-St%Udj zz69Bt^A}u&q_!*ro*ZCbNyIH{3Ij;}kkWCd`2C zkT;!u0tcY(AnFbKA!0DsGB^u`GWc``x(*e>pUJf`i(?MT45wbO6~2Vn5zHG-LGzIe zgW>QhT!T`hIG$l4T!rGJ*~TymX2FMW2l9^LyZ~3A_*mKqNQ7H7cYn!^g?Tj zS4ADMT+|ioSlT)O&JS0bp4swj>EXRsuIZkww zkBi6T6QZx2AO^@M#US|qvX>(mY*ah%V)$?IaN%P)5KgkUCfiui$!vlSR!ZB zqnsm_%ei8eoX1V%3*2JO7n|gZ;w`yAY?X_|Hn~{rkS~k(xECfDS~Q)h*TRzl-eY6 ztIZ;h+9L9+ts-8%EsCja;(oPVlvF!JX|+?7Q@cb3wOdqC?~3Z`JyBb|FY2j1qNUm^ z9#Q*5H}wI1qWV}&Qb)x!bxh1wpNP5YxR|d_ zh=uB;ctxEOtJP_-Mtv&Qs&it4`b@m7J{Rw(FT@UYLF`r+#k=ZD@xJ;>98q73kJUHg zsJbqWsUO8B>V`O_eiEnEFX9XJo4BHW7vHE`;+pzHe6Ri#*VSL*hPo|&R)33|>W=tB zNe*vIMq9SbWBFwVaa$Q{-YxzidWcU#ZM_pHhC zeQS!`V@;KNtz~kbwLtD+Q!BSRYsIL~ ztXTDhl}BB$8mLQFS9QhW%DS1e@+UNO(Twz@P8Y8U@r+It3iI4br^nt2k2k*n?}zBJ zIb3zzX>t0NXc{+_h%Q;G?6%2jZO+SRoN^PZwqRW2xh3k<{ zOV4n2*C~PPmpk+TS4B77jFMuD9{PMfDR$^|&ZJG-MRwU4>g-N2{1UwoJziNemjj#l zja^;l)bxa#0#cmS=}WG&?zDe)5G52@%lgC|fsLCr*tbPNzd`zk)h7&KuqaTVrK* zooBusUXRLV=q59?mnB6}J#F3R!)spGtmTVle;mImL`gl~Y_^7*3jGyMtK+38uZJGF z$rW6u8f?EBI_0#tVmgFt)yt&Y^k&?>aOj)x9(>8{%gP*y?$GADxLWHu3mUbXhP)OY zdf!{&Jw5x|@LXPaKRmP#(>2!9PF)x-^Ntc{T6h2UeK|aolYnTUr-)ubPerFf-NVQ8 zxFg&J>N0PQyqYF|N54T2t==U(zv6Yn>0y)73rW#ikLNezt+^7e%N>)vwLCM2-hiIM z{#%GaI{ozqJqMk<`JD~Q?AGWFtzee%nc2Tn+k|V?V^8>Kk69nC!M7a6ZVM1*3(e(t zako`#>M~w0_s9YI^*SxT5FT3TIr><-EcbiiWt?Fy?!Nrz8vNI#x$W1fi+lWe%l)cV z_=s@!(M-LxZ#l-@<;LX+r+T!bd3xwUT7`R-`r|x(GF|4?)Ju=Bb(j8+L;rc&oQ4+Z z6khWvb3A+7U~Iu~`}NA&tqa$*4rju(x-S1bm&Wwu-1DDzCiLc)vOm0MKL0&D=Y>VW zN6GLF;j$rI4csl{{Qmbwyh2kb=`KI?C)TdS7gq0Uv@og&?q*=^9dp1X5)YUK{~#`A`bH)rMNJBR0z zQ(Z2bWjNEi>+99;J5v`weStH&emT{-RUGf&>7mYeU+MHV=Q?-mI>+e^T{h=-_)OiJ zBk?a?_VbTC4>-ZaPmK73CyqLGBgN@dm~^jB{Y+mV#-uvtdfwOc02+N5Uf(b8gwsZI z23};Q@S7{nLRy~N_wlB%=7gv9#yj>BPc3v^oK#7tZ|E(#`{M(Xaym8|n7t69U*b;T zZToRd>+VZ$FC=hm)X~fM(Ch{82=mf$wxm04JnQSu`H?N*+I#0F?;7v)@Z2eKs#PpK zg@$^$8&=Vi)XAIHTW$w)O__E%yjPuGq&w$jD|w2br}cVx&$SAly?2`QBv;)|dc1Zs z!_#_GIJN)J=Hk`r{y%v>tLOX&SLerc%4L>2pKUr&m+dvjL2>$PZtcB2=3^zH;aND_4m#6exyrns7IaQZ=Ywm0-cUos#xyjpBQHQwt z=_%gkXm`^~FNV|iOTtsc(7$reDu0>d&+89uH)jymoNrOo{^yykUi`!DICIh{e)wh7PKJ5R>3o!vFxVwPLGVf~e?_Sl;a<}8QybjNY&!RoKPjSn<9@IwK z>L$J1KJRi2>Ew;)wbd6)&wQLoPW{~ZIeTW`UDN*aGMv7^$9f8<1}9AozR=0r8u!qX zzI(e2HEZ;LvxR=#$a81C+_9T@nyXU>TE)*gRpcJ$cb&%Fe&)34 z4gYG+j?Vpzdt`e({q?`|Oi)X6(@IqkB7E<1lX z+-6#^=2dl>*J{0?-Wt7WYU-El8 z-g8hEw(&+GCpN1b`*<{c&fa*XFN)N4_>JBMqP)3LU|Y^$7xI@{o+-Ujtezdfh% zMw(|vPtZco=_$OjFSy3LW#hPRxoI=~4L5D$KF>|gzI2nb7u>Y=Ryh57C!Dr!5BKW| zlH4QW1k3zNFSptPt}r_N^O}2Yq0nhQRlj?R9L_ZV$^2}NWImVcY_@$4^YeO<-f`uf zp<~+3a-S9HJd)T?=?Bm_Zd3~CPE`;mi_1ym5 zX}um#R?F~my*oK?sJ9HStc$6$b2X@>w^dF+r^md6Mt+v{H1L^PJ1wZ{9KP zJ+b-K+|hS5y>M>|=Ng)-=kfycbJHQNzix7#=DDfPi{Y|Qe+#GX95319nI}*0aDE=B z=jS~S^XlTTjtt0cyo9=58@uj-QtzZnfgnfIxp4Bc;BRm znLJ_9WlwV@ai{QFV@`e1d)Zs=cwNj>Fz@pU?=y`5T6_01An&f%yA$?4|Ml*ZbGj$~ z&p+$+dTwvfdY0?8bUqbaqm$PLy=%Pp`LEX>_s+#$Kj)u^I(H%)^fEr6m2K7Ob@Md& zH@3LD2c2X5T|Lx$=8?1|+*9>h!2i#B+&1S}Z+$;o5k3;znWs_SaqyA3&UoWhy&j&T zs0<$^_w!si`^rvhbkjv0K<2}yV(LKU~=1Bb7)XF<^UF#G+uAKAf2YS1BJu;_7 zeWc4C{g^kOblT66_^D21|K@!?ofiGUxl*S(+(Wo^iER^}b52itoX>#VX}{xMT*y?UZ-`==-ynMtBd=TE~n>&-u!+r z+u7@1@k&c}YwWf@yp}t-vvFH!)pg-H|L;#5-5TWdL~|E!EckVuy=R-wCniz4ET<=s z-n#WR``mk``oBM)bnD_hpZw?frE_%V(RJ~TChyww*$3gRvGgQwn(Og$x*9Y#HO;9< zQ8`+Q5_;M%x`o?sNpqcEXwJKXFNdEUUNNZz$Cdj$(W{l$x;L8fyep@7y)3$tNN zx1)=~YgCb|P@*21$2dK=Xl$y2lpiIHLuXJ@Fy@2zA8j_Js0Q7?jF0&S+ut<^R|`ugw!kZ zdTCyA`b{JBv`!kQlQ+~`#-$74ed#@`|C?u3HI6$i)aflfrKip5lR|IZaynl6cL|?C zu5spa&n1zo!>Qog;pIA?{J2*GZ+`uL;*EE`T&M5tzW3nO-n&=Jq<$~x@osTn@rq7a zk>P&(l;rTzyySd}=k}XkJDs!gYaaWl$?fbf{ z6>acCoz@@Z4Rf7#zRQVFr|_BwMSI?6jS(HN`&MgEbW}Daov>5p1B>@u6>qzSaEP~E z74N)8<1C{DL__`VZzHUDo3;k!O|TM8nFmkr zvEuF8I^^b9@rG?Za!agu%eDczHCDWB+lbs2E8e(mLT-l;>NuH0D zc#$Pbu>dRa5=(ZzX*Y@dl$?ww@=mbgyJgexB;E^F{D8$wJehZcm6*bt!PJWPf)zg| zF&|IkonR%NlMC^5nlj7ctzgAh?w8^hEZMhG>BlqL&@&JBc9>RO% zVZ2vhtoUZ#=j3x(@vA%M z$)97zyUrKM=dt3Q=gZ`aSn=-j74l`Q#Fz4G@)fMaSMpo(*I0>fF&e)TQ#?^uaj@=x*~ScyO7 zZSr53vk>nfbLQbKWX?Rw!nX2Zp9)~V3gLi?#JN;7j^+D?oK;jTeo)2X3MwB?QU!2r zRS?%#g>eHOW+>jrE{a>JVz{*`f!nB(xU(vSA65ytiz z?xU*VR8<4_Rkd(GRR{N1^>CVMfCs2XI9)ZtgVaNKuxgISsFw8B$70%}YE2%GX^*Nc z`3bDV1l6AWB<9Fh9mx|hN51Mzo`gB_RTuJP%#p9UlBZ&he3eX|hB@X{ck&EOOH@6{ z&tqDmN+Hk2O3YEc$#bz1^HeJN1xy=J{m3t3+K5Uczl0Uqp{)Kv0GOzTk7$fq%_Lro{2!L$xFlY9=-I@B!k=U9pJY7Y4VR^p2Scl7GUq0=10%3#JvQ z<>X&6tw60L|Bh(|YBl)}Oe;`p$bVraZmT!Qe`6)?sP$xFttU%s16g5OhqZ}pW3J1* z_0DzK+KMBsZ8*x>jtg5m8Rs6XL=kH@`ChCm06XeU7VH z=W%uGBCcs&#&xVKxP|pKZfSjsAGNNslw_<#H{Ru!qC2JyTGw%kbp!XYex^JX(*~`Z za-BwHTyO>sHwI(0Kv@)wL`8cMP zS?$RuF|Ew%NIs2eWmaeM8B8m)x{%LdS{dJ`pp{`-nUzewfN5n`ck(4nE3T5oPmac1ee5U5xiNiU z`$=*vRw9o*ksODW$ZJm`=fg_mwD`Hx!y^LHLE78bajvL!6aT9wre#l;fo7r#R=JtBr!rp*e+M94Idoxb8x8ecz zHayVYj??X(c#yptkG9{#W9&V6ti2D9v-jii_5u93eF#sm59258kMUFXF+9;ej-Rnl z;>q@DJjFhPr`hN5bN1(Wx_utcurK17_GLWFzJh1lU*kFUw|K6770-#FERoXw3U&FLY`zCn>rd8U%kyl}^U-m8X>zM18{U>=XrnTC)$?Gt!)xJZ16Vpy@ zY0*w?PAg)w?ZaE_0N!ec@Y{AI-eyPRJ$7!q*N(*>+Hv@Roev+k3*ZxWL449Kj8EA` z@M*g!{?smp&)6mKS-T`YXP3ek?F4+oF2hs9pD-=RE=T?a(}L_o@~@cdk)1^T9dkXh zE0O=eT#xK3{oX^(;=l4B?3;3Gj zdwnf&QD19(pRX-0>uZn8`8wkAzRozw*9BMfb;Xr@$+)twJFeyHiEH~(a2;Q7T-TS1 z8~FO+X1+As+&2)n@D0MPeHploZz%5R%fyfQhT|09NSx*yjR*L~;(@;LINkRI9^`ux z5A{vN!+eu)rf)JH=bMVh`=;T?ebez1zL|J}Zx){Dn}a9$=HX|2^YLWg0zAdH5Kr|j z#?She;Ay_4_&MJ)Jl(e(&+@Irvwf@a9N!u|*Y^gV=Ub0o@NK~JeVg!$zRh@nZ!3Pu zw+%1!ZO0pZJMkvpZoJ+19^T>GgWvb_%SeTVQN-(mcb z?_+$}cMKo#9mhv~C-E`gY5a-r3_k8VhfnxEXAUPZy&&Ite9Lzc|KYog|MXqKfBC+~ zw|(E@zkOHn9pCp@`LE+h{|y}F{~1U7Z{l43-*9gKEga+j6X)^Y#&P~TIImyY98rD? z=lA@SL| z_>1AH{t~!`za*~dFNJIQ6L4*R8C=g_4%hc5;->y2{E)vAZsxCooBONb7XBKzrN0(# z<*$QV`|II0{sy?6zY%WlZ-P7cAHtpd&2cw>OWfVx8u#$G#cBTbc!0kn9_a6k)BRoW zAb(dp%%6-i{oQevzbAgipMod*d*dnoR6Nz+4?pWq!?XMY@ofJfJjb7bU+@pb^Zl9l zMgMTTz&{c%_m9Ra{A2M-|9Jem{|UUt|0G`PpNQY^Pr~c`lks~0RQ#rY8s6ZajyL*e z;!XZp_$~h&yxBhwZ}ZQ`@Awzs?f!*$hkr5N>0g3(`Iq9|{$==G|8o4EeQ)(&h`48X={zLep|1iGf{}^BPAH!ezkK=FsC-Haw)A*|Y48G<+hrjoKj{o$Z$A9@R z;@keq*cZ5h{eiD>An+}Y3S7m}f$wpyz;&EEa0AB#e#WtZn>bJ4H=I9k3l|9diQ@ye zalybHTqq!Y^yC9{NyR+@A1)FI_~^-F&ZvP9`94fr2t<-gVA?_;np_g|Y%P$RTnf`J z08m8j$8)QMgsZBpay?8t3X~!@!1OT!3FO9@K1QGnxhbZ71f90uPZ>G4~yT=Hz~u`;I_MavG-n23nH`V%l$@ zEqM^;2|%DdIRkU833Mb6!?fr?XL1(iP9)HUJQCAi3Unop!St5`$>edE>rtRP`Ektk zDA1EU0n=*=q>!J&wC+G}@&e3NBalj7h`Bcj^dm3E+?xc_$V)KKxB>&oOELE;fkEVD znERAK26;K=Ed?+vne-xO94+rMsBY_3@|}Z}1Q<5Il_IgCFBU!DF~^@HoCFcoG*0 zp2kIkXYhT&bGTUWb6hfb9zPJgh#w4I#$|$6aANRlTp{=^t{l9Is|3HtRfE@Ywcrhw zULDi!f52egYEHw zU`Kp7*cl%QcEKM9yW-=)WPBpn9iI&L#HWHO_|sr-d?uKR&j$P9FM?_Kd~hJX5FCUr z1~c%b;81)yn2Em(4#&R*N8;auqw%faSo}wDJpMEI1pX`dB>p=%5#I?;!Xh*o%g|J8 zg{EOUG#&dwGqFE33kO1Ta40knM}+3%$j|~D6oHf}u^gP-rtQ9NLQS32npohPLCPp`G}?&~98T^d2rA z+Jj4k_Tl?O`|$&z1GrS^5H1}$j1xj1;|D{>aGB6?TsCwPmkXW7 zJTp`V&k2>ob3=)EUMLB_5UPadhpONgL)Gx&P!0TYs1{xls)Jt%)x%3e4e+a>MtE7M z34Sf~5MCZ?j@N`*;_ac<)OiP{=NW2C-i7IThT4Nw9m(%wdY+-qbbtQj@X<4CU@fAGVphyp?G9OCLR|t98ZWCi6=#j#xF#SWp48^+b3c?c>!kaBA&pz zBA&#bM@+~%#D1MCY zB9i10e!MP89*s*B9p&1*c7v=rr7v%%w1+p}Gfqansk}OMp zNtP!sloiMeWkvELS(&^@RwXZ%)ya!xP4dgKHu+^)m%K#QCoho=$*;)91E1 zyi~Rzzb5;TUz2^w%VmG^ayfwfx_q7dx?D?MBiE7F$T!Jr~{K1kjr%aV7?^5osJ0{J~zoBW=vOWq?NA@7lolK0AP$ZyE! z<#*)s@*4Sq{DFKy{z$$geG9M&>1dEAx}TmGR{7WFhi* z@*eV4c`x~@ypMcM7AIem_mh8+WywFt^5pBX0{ObENd8e)jcQ=Kd}rJ+z6+oDHfE|DvME#jB0G_Pkq?t^$-d-UvOig<=g30MAWQW;S*qD&TfIiM z)e5p-y-D_~jpU$uha6Np$PsEUIYNCvF0Q5&EQg;hm?%o9=g1}04D$WzdGh^gHo2sl zOD?HiAU~j9BtM{DB9~H&$feZFOgL*I+5F|hso{KBjk4KQF3>+m)u=_K<=SF zB==AU$vxFaJquH z`jXsNeML@FKatbaFXRF0SMmV$J2{=sTsf=?C-UjLO&+BD&QQ6?LsSfTh{{7A zs`8SDs{G_(DxN${6(VPwo-qBTN8ZFn4~UO7NmSzuw31D#8(PUe&q)yjIIE^zkbm ze1ugU>O(U~f&MTM2E$n3pOj$FkYNVIS^UZrbcPI=1>4~md<{)(ep?dGL17=i4+$&b zBG`U@yAd9OL9h&V!da*iVA(JVCc|F11+hWCGY!q5J&b}4a2Bi(zrF>Pp%Zk2b+85e z5xgl1b)g+Bf-UeV+=M)l)CH!8)+x_@yrx0`uW_ zh|bG5Vc{Co%_qccu=De~xljyR!xOL`cEMpd1?Qo10e-_1K7$hR>?^np(FOUfOSlh8 zLrX}8$01aR@5#VeI0Sz{uEP8#Ds+QU@G6{zAED_z{LTlAfGO|-oPzW47nCo;Z{b2S zcm)o^=aA=KeybDe!DBE0Cc$ht1fPN`N*$pbbb%r89IS%9a0C8;===EYKGcD(kOhy! zbl3%-!}o9-@)Tpa&>u2jBs>nU!!Hn7oZrud1W1DV&>cp=%diqoL(vk{9TvdrunBg+ zVK@a>A?kjP8+Z^Jmt=c@?*WcKSPHMhU*Iprcu*JGz!tay{?cp@SPbvLIfzZ*7=iXM z44#I!U_T^1$ofM%JPz-`F}Mu5$}k-2KsQ(fTj5>!1pH;0H`Ib=FdLS@TDS=@Yj6;5LFo#VLo4V7zk^Dm&JYg` zVG_)PrLYE0!e5YBk>41GsqhAT0|hIw|DZlJgU4Vpya!j{Cip6I+&~p*1`oqTxCGas zaTT^DjEB5c**4XvH)OyBmF5+VKZESU%;wCTY`4b14hFl z*an4a(w<>5%!gNCGkgGFLyubg<}f@Bvtc2ugZJPB+=8;TIj=wu7zWGW9XJS|zz-0p z!#0P;&<`fS6j%*E!)-{c%drTlFc@aQ4%i15Af_JM8Hz&{cocfWv#<<8^;sV%0hJ*W zUV#m;9X^3u5YvElhM_PQHbb|D{N6jvhGnn@@;2gk4xtaELl(?}E$}g%h8u7T3OA-c zFcV&b4X_PP!58oq`~W4Ja6N#L@C3|;t#AO2!I$tW6mH5n2l%Wwcr!bN!C zA+{S-hn?^-6mCYlfQB#xM!^JF0pG))5Y?P(EOdudm=3$)Qz+AdwgyX~bW7G7R>LOP z36ZVXHZU6&!fS9HeuwIo_xb|EJpei(j-Y^g*z+89@&O(n4>|4l$F>nc@ zJ5pEZ1A|}$EQ3qn>%=()9)NOC8(xO>AUm@>m<0=91#E(AQ0ZaLPp}wPzvOC)ls=;`e1`FUU`~XvW@Qo`t1sC8JSUov5pgdHE2G9bM zVI16qzai=|_92vp6L1NBfu?(GfWJ5M zfc#JtdO*KEtOKlpFW?)9NafrJO<)W>4YOfcU)muQ?az4~+Q1{w3r50j*bgUwACwjm z5C;!J8<-8NU<14Z*P-12&TH^IEP_?A1NOnk@F`q^t8f!?4W!*beMp7TFc)5iP4F$G zq_d8LSU>0oLtrJm3E#ob&}A^^Iv4{R;2qcle}I)i{fBVQfQrx-dcYt!1ZUuD2o7aC zK}Gl#Vuo>!fyU4gdckaX1=hjGa20OBvP{k!Z~|_C$l~`bpdPe_WEcl8!V2g-oa+mG z20uV(1jitBhWW4rR>20SKax6+V&6atTo}#yX$*ZtNQJ?$26n(cI0C!IvTpDxT!91Q zI9|pxF64WhabX`Ef!R;6EZ7Y9^@$LPK6?UNjFqSX=D#g&;&TC0^y~ztm~Q_3Z__M% z`+pu*bHo2UtmuCkW|yqeXd0 zgbI)(bMyP?c||3t3{{{iRD7FUD`X-_IRtd65A_WRe&vtMgm$HAJSYC9+^RjDV3aO4b#lWqmP5Hsp@B zp%@3_WfPu^HsOhA6EQ)y5>N6^L_7r(;c1uz&&ZB^2c#q40O`p0KRWX5kB)rzqa)w^ z=*agzI*J)E6P|}zFdOE;T$l$hz(lwRNIFk1(|Kx{&eO_to>HdsbTVDMD>Ha9nZY+mM)6c~6i*{ZiGBR8{s*uhK7<2s z5Dv+);v;@f|1cbZkL4tuOgC|~7i~I_34B5{2 zLU!`4kaxvx_?vIc+yTLF-b+yGdts>`c!v0c@bNqLehBbe_CW}#+dMbCEh70%`zVO! zM3M_~Lkz@19*BdykPq@h0f>i!PzVacJx~Phg`#jD6ocYW0`7;B@Boy8(vScTLK!Fv z<)AzyLIovdl2WpwvScOYla-+gRE27MucbQFfSOPXYC|2U%Xe7nL49?vY`}L|8bTvz ztnQOdpeZ~A&7e87P{m|RaK7o%8rncxXb0{2-b)8{zwD?=%1+Q(Js=;3E_?^(5$LKO zl#fC(bc62D1A4+^kiz$4dhzX*-l~=C1F5Q=>;+$1&QRk?8 z#jr(7l2d4lK_utgZHu=^&VPQSp1vsXgdGB zEXu5K{@)g_W|!IGHIu$K>AFcbO!_%H(PxuW_*GwLj^(90Kc0=5vI?fGy1e(6yGGUJ zMc%-0{;O%qYMQdzrmVIpt82>YW|!Gq5#05#xh8~D3zOQI)XtRqnyJ-5Q#R0)4KiheOj(90%P?g_vXjkKBD_C_nem31p_!)6!_9aj9$FCOp+?R z4J?yVb8f|hTO_+jeH;4j2COhi_IR-7O|=<{Zi-b6Kkf3GgIU< zsenlZO)6|s5tE9VRLrCj*@?SI72f+LvzNx5gDERz$`Vxg?319vXP+`Ed}Nn1DalNm zWTvfT$|{+%DrSCF%>1gE@v52eYM8Pb*=3xuP3`NMxtXH5nWCjx^R_0nH>smZ zy-XTlQo2clO&Vg-Fq5)O8e!6??8M!jsnr;>ZsSbZI8)Qd&9oCtddj5dO`2uWY?J1g zG}okgCcR+Ne3M=@X@N-#O86?J}c#{g5bdO2*W+%ZnEyJzxJ}cZBi<`3IrmVE(Ucq=$VNwM%UWM%O zY`$3;u1jT;s+v^Yq?#txHmR;j^-XG+op|D5mOCOl+2VaO-d>%Y^Wh%vSr=r22MvUpCH8Hs6X1@3+Aw z4KXRpq!A{KGHI_#ADHx^Ne4~($fTntePYrHlTMlRsYz!|x?s{JldkFH^iZ$a;Va3H zX5D@=OxGu}dz7Mrxhq~#{9%uYOM z_lNhwtU$PTI64$AYZUQ#UFRs~$yr2rxve9@EwpV!cu%*D2=D3krmVdw>lhK<8lAI~ zEs8|C?Sp?4HZr`lCXwN`&@p?cEjmZe*1b(zbcwwDymKGmqzlT~%C<;0<8?Qwr%5R$ zor?@_-Oo)rZ_-7RE}L}4q_0i-)}*T@eQ(lrlWv$Kqrzu_$f$4)qD{(eQmjdFCe<+0 z)`|+Rd9A4Mn%6T!8)PS*qDF_e^TO!x-dY$P-do#E+4k(RcoCb+og!YuWhb70<__?qTz2C5Z+v)Z z$4okI(nXUl>+~si-OhU>d+|^5HonF$3h-&awoiuWtcGM^94*V^KC%t&ubrOlsgw-S z(+<JW_3@ zobiw9k`vm$YX71AxAv#npJ^w^dxAXWmiObOvIgEJQ}H)?=y%%twGU}4<b80?0SvpRTEAeG@P3OPyb(K5X8NVkkXI;ZS zy{tsbSymP8MS4Cfv|rbzp1GXbK8e$;!#KnG6Hm92bMtSZTl2M7Xs^Wy@&}wOf5S_x zsxiDLWH~uOzCb>woUOOjI!g9QrzSp`70aCn-z?_YwfznGRIF2r#^MDk9TSLe9is}XV^{i zalF}0^Ye+QJpu>pw{a7nQY%5nouaAe>yyiJbMo{LM` zZ)$&p$NR40bINgYAmKj8P4G5307v^5;oRCu{*B~0f&JJg598_9X`C#-#sS;$;()&x zpC$zgZc&_$t+%H)D0a|F# z*+&_{G31QkGdNmq$J4F-PKg~;%BfocoM<~PXF0wc%)mE-PEL^T<79aV-_hkVbcXB; z{h<8^jtoVYcINpY_JyiyH^gzFESxN#b4s+w``qlDKi7nuGkltLPZ=jW-XD1w@_Gj9O_RJ(_9LFNc85*G-rM)K9 zu_C=NJ!V_&lJ-(cGOWLFvW%|eoNpZ`+K#7Ni|}}#vo*?Dj`QSl=Gj@#Em?M~!rMPl zj<+hug>pMXd+MQ0_>~5yWCi6tqZ~J}U9Z(+Iu7dbBeVcy3*b`v z+WJYnQ%|3KfRbd{U)#;jStVdQIbb_EGBAZ)BYLs+YFsaRm-a#2HaeN~Y6hd1QvtMfE`-S;}4 z=X1(4?0q;{euNWk$Mk0!I3*=+)yt<=`@WM_YzglZ)iug(E`;@pS8y zF1du2a<*Za+$9@2ZibU{J0;1w?MKU9lyui68CK~=yfLK5PqdtIp4WM{b`@PRSLexk z{C+`aoELRThP9k&XX)}e+KaW9Xs^%Rv@!2z=rLc@en~r8*Wq(LPKH&viBt1ryhso2 z9I=etIbt_{MVGv)y)Jubps6#o1a6^AYQ(H0*NFKZcZq565Jz&%C|oLfn$ENE#F)?U zAA0Wj*GQhaHY`4WU1H&7|T{ar!MAV#iW)BX*DWF>K{=dLWT`UTfoIr}r3{=XY|k?DELA zPIk-hC2xq$&|ZKK>OC^uD$~x{7mwgPdcCGwlXS^ayfn{loE*5nz2mO9RO}_~$PV1E z#tV<5;{keqO^i7~&dBRb6&G8z z3)4nB|2ogf=#BR|>pPGuNuQ zzs@@i-^lx}E-Cz|(}yXAPvp5MIld8eoFMn%WO)If&RaFv z8Q-}gB71QfYZO~nNRj`JO+2Po&H#YTtH5iEAixfALyaq;Y8cX2{O8;b1f)| z6K!X1$$FkktWK09$U)juaL;_Ra9r#=+8<&okJA&|kgw`v&T;7G=Hx{Cno|<%^tBG> zE1KfCi}qJIE_P5a$D6c|-~{RPxJu+N-P_rNPCqIse_wK`Xs5@Ols|)bdUCdL^$ zD#k6}MM+%jXL@M9KF&BLw3D>!;mrI$;t~;7DsQyquYofxCuin=6|c{K4#&lo=*!hD ze|KCecDD9L?JL^+peo~()$X8u5tl1awLeQN;LI&SI!>0(G0&c*Jhi|*X-;l}Pewa^ zgHq8>Zy_%BC0)J;FE8L5;JAeLLwHn-b7dT({j<-x<|gW%K!R*F(8*4JAVE&j+37PR z$k)lGVsB`xbRpi48IEP#SR9DosQs=ke{c{>kFS7>#gEo`8b*ulx4n8`{b82zf&;r{uctOQ$^OlqAUevYfe<$K&H`;4blL+Rx%* zd7R_+T>K^S<@nsg9T&k9W4hzsF|TN^#+@TR!Kd^YsdK~~@(G=fW?xh4jo@AC?A)C^ zF=j7rQZRm`;|H{>;RSj7;?#nRICsUxE+EIn9?`yxhZl?;qTvPaCC9}M&?Ou7 z__KA%0qv98m$V~CJ7eb6Zlv8-I~{L`oq|&fy2s>3UA|rWH2&G=^ahva@r`k|RXbcF ze;0f*+UcKMDY%JTD%$C{Tq$^(92Xlo)^S06rQl%gaoW#fE024Y<_C&7R?BL4(Vl|a zWM6IHCZ}1>wI(h$e!SzZ+6%M~DI&ZfPg5l&5 zFae%~r(hyH4T4vk>(=PmGpS0?qza;Tht$lB^bx6TM-EQy(;##7;NEq6nPE*+vwHXc zmmz%^!X%xC^hwD|bw|!FYLqc}aBAkl9^etLWQ1Av9r!P-Mw1Q3hM#oduL?~)9dd}ao3F8k(~Kd)WaL4 zr=|>cMtA@0mzveHaq8gA)D9UVJ7x__>yz4WGx5u4Hzpvw8KTP8HHq zvr@wgcT4Y{D!Y`aD(R^jW(?=JF-L~8ICnssjA4UV%Q5U8R!r{}cfj3q%r0e)mEC%T zx2^l9+jiU`!&03!8{TI~qx3X3Q`3xL?NU?SBdCfV4;;7Do4Fq8?y9&WHO}Zgd=OQ4w}(5TGvCTO zb{yWzsY|caW*J!xGy04+hi3NhyXWanrCW$oFH-|OGpBvDN=?bkZW1}ISI!l!oxvSb zMx=JkGUryOrRefTDMM0vrKP83jqa2&Fjb#&+yQr2G`o~ltXR>V(m8fJ4o(@8**_zz zXP~*w zp_XG|#iXjbvMkC?=6dA***ax#THn-6cKhIdsl$d0OB<{YM0a4PVQGWfruSj6vlX-F zbk|aIF0JS;^{#O%dv&RzWB7`n^U2X0yM~VJ?yR)Iy|conqfVoTxTlFEcerk~&f1!7 zrzh)_5uU(V3wNe>RV>HCiWRDvO{bG{jiGsDcWRt1qKj#a!?HUyrtI#6!yVIY9eSeH zDFag*4NuSF8r#3Y@T~qBbZtgA89X9wSjJ%IRGZxlk}8`z=-{>#-8X5Rnx5K^(}1&5 zdYD;j{TH?3m~zf<8H2;8ZapA;75~@sjvml-SjM1#-BP;n?iFzhoujF`vvItmN&nd? zqfts$N_s}WCWEtvxmR&r?yR^DrjGhAw~kFYuez5Ocig-7O^$^XlWORFbJw`pr7W$Y z9-e)A?=U<)HPiGE+#%uXwL79yL0zsltvR3QqVNU_H1mn$Q?svA&NTmzwzuz%^GNapQ!pBhKEp5!!)O?W zuhrArYYcWRo04t0J+>DVMNwQ!qAXJO^bH2J#j2uMBeJTxswj!ww-_%Dhr?iTxIYg2 z$9#zUj`#b;OTIjrPf2pm!m#*cMC5y9WJF|S7DrVTW$X@JMOg7obv)%WeJs<-HQWB| z8Fq%)xs<^xYM`KvO=m?Ot30PI2My&KjrC(PemGnwjWyxD-X65|ql-O+{o#DNBGbws zj%1h4TP145&iw2QHU~EF0yUpMy;$Us?dQWORkNKT=+lOh#;79B0S_8aIS)@SSKO`d45w!o5h;837z49{=D9qaKA8>I3F`{O3c_vWQjSSiXG`H`q&+oEp($L<|1hqKkmWO+1PLLqSs*W)CPZiHSe7V~8!+I==WyP(o4 zssze|XoijMy}UrOh#Eh1nAKv&k) zPM-;YJM+b*I5>{x9eBr=0$R+lD-NJ7*W}RsiG%Ahtkb zy`OD`FSl=OZGZOZ?#}kkr#rj1KD+(p&09A)x*^DlO`Z*G77+0ETAcW>Odz4PhK ztj6yg zyq%hq+6%Z)Rkj-JT`vZPC_Z1x$y-WSl?1ELN`j?_uX;yOI9nzJ4dcw40;giV`_R>> z>;X#(UpB0^MRs%uC8@?W76GfID1!c}#PQ@bA*c)-wxFw13MIQGACX}sl`T0IdQ-a4 zEkL0tVCzfy+@viS39D0D+h8Pt+8R1N+UzQ7snfGFQY%{(ml70rL&%43=n)EqnB=-- zx|*})6p}*o1wvaFHD5q__6*7W?Uxu2YhY6k2C^+G!`B@}7L>*%z6PVhlu#W-HkF>! zmWnKB`gF)tZl1lZ=Ox;%o(D`@&jTXgILKNYO;f|| z5!g_jfWw%^&0Pv>s7@eDn{3pNSa4Loxw!(+qqzVR7Z$#I6%pVXzFR=OyH-uDCS)`% zH38_&t=EEcC>eS0qSziim zC7pQQz(TqR`uGV?&HwfQO`-q1Mc$A2(sHDNOuLuj;EZh-*N5nV-|T_^!QgrAs;o)% z@Qt>sH$=IOAqySA%^dI%5?*DXx3iVu4?XakaKp9eZ@|aYf`8Eir%S6z4-ZTW&W)pu z_!J(LW{w*@h%b8Jf9Qd4eF~RGs|Na3T5#$xO*j+>!W(jw3hi~`xLD$%xGo^F{>=vR zMl36FPt3aY8L>U>oP5BBanX~C{@feNJUcKbBkH=Kw#W0u zT7^u++z?FR+laX9Uuc0a-&bootlhwg6k9ihM0OKzPdf12y2<L4eJRlH=QP8%H4_IF?Mi(OoSdKN_x{Qk%jlCA?6F^NZzZ0o|o44Yw8zjHF!zUmRU3$KRM`Xto5wlp2gwtaa_o_%x9yEF{UKboA+dGs7@c=#va5{Vcu=T?M!doy=oKasDnngVL>=qakNh!oM}`?JvVl-|7rg1B+_4x(h&qNbSx+9$ zad=c@65Ra@VYMET&Dc(+eTztVh#7#d_I$Y3`pgoM-WjLEjh8jjv`$eg4;Ea9D_|kM z{|UZfeDQ4HaKbO|Ry_BG4FcBBG3xM-I&p^T&NEPPvhKlGgtX6{&I$nchJU^!-Fk8k zu@fCOVdwDQeN7wbY!2V(YAXzI{s+bwZ7-KYxT~gXo_-x7QsJAe>t;sbZ`)!@h$upt ziM}Owb()XqAv{Ra;aNfUqk6`DMW}bq46f)`=bm_7$`rp8x+z|!7-JDj1QEwzf407H zJsi#T@7`psA7Ze=*~5~~Qs4}dv}6_DLq)*zommG@2~dIF``l z+!mrGCodLQ%y8P{IBq(c7?g)|DP<)ZZVW!;>6RszZWC+q&v?*+Lja8;P#C6D1i9sa zZo)msQpdW}SPBw821RM+Q^rT>=gD+7JflC#i5bEcam&@3LfFzG0PGv?W`qEELiZU< zd1tWVMiXcQ6mo|0j#;3N$Uj4!VhC_{pshN-IDvEDF|y6CEOnxXGoD0=j0YT>EH$F} z$;oQ6w!}z+oh&i703ydB{L1N8=1wrwl4n$K(QAullNbJZW>F-D0oC%7hvZ85G=7a? zH8TjvF(WEW(N(Y1l&jz;Sp%jQm+p8VJ3b~rY&EGQ!)gUcl$5j$=csCJI=SzpIdSbw z1$8Pn9j5{8`3uJm;FPKbuHmOCN~Nm=fG9Na-SDjd+VU;}?3GzLwaX==X}Mg0&bz2q zy|zirhO}kWo)zR3RW+x94g+f}htT-~%C2i<>jrJ~7J@c+3yut1O$4040zVlHwh?u7 zc|N~babp%}&O$Vvz5uD%7uTbjAp_0;sXLR&7-&~N8XzHsHoUw%yjUV&Y?6`pfF(=R zWK0Q9mDCu_^u^@p0=7z4_`~I#Y7*oL^w#NusQta={9-|M`+6`fH5HpHTTlnD2P{)5 z_~CHMBz79pE*iz$a0zAsUga5z{N_uvqTI? zTugv6ay3tvQXT|d|2aSu;r!DTu-EZR3tx9!Xj`9t0jNk=W-*b$PZJrR#Q`rTf+7Pr z?qIQf0)T#30?OE13U%abp3w`ub4H(FHe*HM#spc@XjECd-1>?+1knz$m1ceBX4V&< zshNepCds53ZAk`HCdn)Z&J6IiS&|tk1Qx#9k_?EpB(uDj1$_01EF-!}nk2H2a7o|{ ztr6c`i$H?aMM&W@mrF>FJo?`#v;6|t_33mO#f?%IS~WmPTSg++kCCKf;(USN7i|U9 z{TN)Ukd5me1sJ}$?i0GT?t#r0DU(H%G?+sQNP*{(r2w~6M-NENQCx|js8-^q{{_%$ zCEf&7RwA?5O5~@l#Lr_FGj@ke<4SDe$kRaB8nKRNc?}N@Wm1IDq&%@NSp`;HE_YGT zb!5t2(%q1)SkjjuWRKuFz}KcZQwrG%gtomxP)K`)SUor-!&g4N3XwK^p0%OTFDlkT zB2(~1NnGt7u;x)yw&x?28P7-+dp2p8^JlotB<3TMa!F|h3zbU%X&anu#?TLl-BPcDbvQOj>ptr?^aBn`h;7tF_riaLRx5%Jc;bO3bY zi*Wb;_Ritm?dzX^5hOfcKN+g{&|xz;{UqURl3LhY+F%n<7@Od$%_c^IxyM(B8w`i3 z##b5)-n+}WT)DxBG1&!iIdWW;LJ&1J5W|5?KOrX0_fYCRTq1gCie}x6D5EEj|gs(O;83_b0 zzM894QM?5Lua&!%KrH;won^qE!w<&GjbIV-hgFbDZwse{Z?24lwoxylxqvlxK@UnJ z4k%gOh)Y^b#_1js1`H_j(e4X4_0H1L2G|Z1^sp|?#+UuoYyqdjCEn&J@>!>AUb+6I zNRP)ycTj=|@~r{BY$lpx0V!d$n3_bJaRb+^prpW@s6F@)7hd8QS&6NohAaRnw5LKJ z0!XKwGmeDKhMqd%thF;KpeU7p2k0zWy>S46#XyX^69up@Z+sdj9%uW(AL1hRag0T7 z0cXlWxf=kElITccICtq$0uCn?dRE4BQ5@nN^Y$2c=>~A$%KtL-`086rKy~g$15%C# z05(sty#R4c^R)LJsQdFVuDE;)&3HL|2IFp@`y#Iq$$Gs#S;Kw1`c@ci`*3G}A8kDd zhnFj8sn_-o!uR1waDOlV!rvo1xt^24kp24rx9*?;=C=38cAh`B^ZYS9ql;-U5bNa8 z1YU&EFyKbb5=^3r0eleQNVRw^TRjg3k){+7HvsI$gVCApVkyof6n;zb(2;^n7c5!X z5aQ3Z@1^f!a)UJFr^blLN3^=af1IvQ$IIdK;aOhBqseTNK>4|@Q9T+y_pQj$=EXVz5DF)Z9uLzs>XUq^B_f|>Gn{G< z$0XqV$HciqNdg58c+{*8jt2~bn2r?cK95m$?yi`z1}1m; zHqg;8re5C$Mc1v{AhFu*{IW$rC!U@A_o1^ZCk>JZ7#Q4Vh8URqFr7SaP?U`jFH=S} zPQ$sqqQQyTFfWdX7!jC(N|%1^;zH4K688#&nzZ#@BJHFoqx14b5K)~`Sl$fM(9h`f zrpAUpR2d86PArl%n|z<&CM%+qARN|EA;<8ZTYzZbI~dx**fmX3s^Y9b6SZ0sY_0gM zl^|+cyu{*SXm_?okO=BL86GqE0;jTCVs^xVAPNQsDZEgqLuRK*?~<+`I-WuwC!Yx| z&4)PMMU-NS=(?~$<#1e~hd9v1aETOSArsOi)*1vEwXzNy#M@o!dEToYXv>TUnT~+* z%dhgP=zL!t3RkW;i`7DMYS7r%=*nI*Zd zbs3{szuhqHvQslmh9O5#Ep73}tX*qX2EZv8^a({Ix~91_Vel*YbgAG zn9Z}Z?X$C6SjF&4%6&`?6h)=Iujc58BNyMQX^gmngn@j|H!^|w66@e9Q&_99_b{|f zPW8@s<`-KOXy*hqTu&;M$mYj#sJPSwR2%(>8nup_0$bWY7_>CbZ4!<~_Na?x&2A9AlyofYFFW4z-g- zw-l}G@dEKUHu&8jXxl%mWTn^L=`PeIO=CE%(ISRQx18?G9Xp>ZPG6^?mKDwa1kN9= z3FiJ@VIGASbBj|JWdR^>au3obwXA!q5?4W4^msiIy|w^QC4DqmTyNw~g`k+A|aYQs|gw6a|13epff6>3}A*;-LB&g%qm?uMVP`PD7cNQbwhN zoy zq^gTrJ7Z!Y8mf`(Xt=ofppH(LSgt^Q{q5OcfM^5yuOpDPGXw|t6a7Poc@3z#r^@fC1X7?ow2T#U&4#$)sv!pXZ z23jOyHdT!X=9JJ{D{%)ww@+`wYcrhzGAdHcrON%G2H;w?U6>3+x)^0tng7k|ik=#z zU0~+0xxYYX^yrI);{kx)q=d9A`saX6&N?JG4asJ)!sJ;(bxpt;F{%m(Zm07?DP+{L z;3;Gptje@>eF>lRXtK02(P~ek&HibG;%-iao&=$P3L&&mC(_Tn9&T~Kdf}ENg|A)% z`O?iO=#G&`8BxGI`(9+#=;apH5WiTs8NsX?ItGKH`DxX1(B@3r0LnLU`re>SiG5O6 zf+24y(zwZk?6NY=EJBiJuLuCei-oq+$Tb$DgT70SU@Cq|aVwN!G~4z~I7Bs`W=gm` zO}wiSmNiRS*E7i2{J@}P*4^1y2FtQ$NqDOqLqaie7v8#*B2M0%;Y%`BN}e7tKHMs! z_Yj}dFbqQF!7|yWD=3ycRsz<7Qx3~@fQWuganw_49^s@1I}2+j$`bN4mM4B%lnr}n z$vU#}@$!Lp z{8al6wiF z!@Q^&2}tW4AMzl&;dmILtP*-AgmZ6nU_Frc6X4Vo_x?&25-ar0x& zO&0`pMo^qgs@kB!86p2*F->_8YqwlO{-RkJz&hp=3ZP0ZcCwN?)3I4haN&g{qQO6y zueZk-&-HZ0T=TO@34ygRf4+YLf7)VBiow{wsF^`=<{fClr!&~c@>DWBhR$y1zUT;1eL21F*Ih_4)J6|_5 zyU7)X{;|^M!ceA-vT~fByqQl3NS1`QDa*+jZo&;t=oEsyy#OHx>yfPCI7Xh7QRRgz z%eoTh9;R*70P;eb>D_n`&+5+rcc!?lm8A#MaX`=iI9ZG64LBenD})D==X)3U`?b-o zFQdZ#?Q}4Zw_P+2DNBmf=21!)mZfr%utF6WsPPH1H zyU=QE?mnxrrQ@u|$7LqYs~YdirUzYk#_HU;AFRfz^Q(rt3#P{SboNs~&fts?S2io= z;YQnnV+6Rbwov9*smro6;btE9s5EkQohl6y^O4jTb&AyR+(S}hqa&n7rS)G8RmZ>4 z%A2_|YBctY(qB=NbX*lRK|@Ye?KGdjhRnSb&|hft*I5fsL5+_7fdnzoqbb$&bekPA+&60k{_8D8ggW2Tu; zjN)bXqrZy zF5>p)ep1T|J{mzR*>0hvaH zcO_h_F7Xa|u@9-?dVN@$gLQ#&^|V?NszSDL_GVKXN%I>waoR}X(Ygsb-G?JYW!6Y; zAkk{A(Y(%IL+|4htBsLW*+%K>=haZ;u{d>2V(!B$aoLmGuT@vYQWY2PMlS^&H2SQ1 zm01+Gx-lBb_Xz%q8n;8w$%*(t8c26;)F^};wu-}|lRM9SX#PM`U070E+jyCsI-4+k z4{lFv`HMznw7Y44*X2D#gyf^iNsTby(@OnVe6XJZE4=z%O@XM$rtj8RuK8Z17*4y3 z`RKHf(e%C^bR57Q{2{%d@N|h=qH1&USkx$PJndZRmEk&<1~0Yqi9fT^Lu`IE6vHWw zQf`ekRy-VSlnmy*`I9#G$LY9L9$DkwWcH+mJ3PY=Wo^JeUQX)gztOwWA6=*Cyh*zt+*#P@b0pzt5ey1G@mze z;fLcSe*9?NKxVF_CLYUuiff1S^SVyagii3nT#Y(dKEY2uRD)tBqW*?ch0Pt7y(Hz& zcU5KZ5(%Dks^An8O@!{Sz38az^-|m$UP6fWqo>D9Jl)cZ_cH>0<*;rzJpJ)TVbv?S zKp}3xI-{t>n+T%S-O8(1e`*X5kl^5-P5<0etukUV%j+V{nb(|+hw~M5*46~-X_P)h zQjLT3bt6Sw;5y&`8JcR{GSy&fIDU!}dUPN52k7kcI@9*Wc-jDKWD6GZqRztIssUZj z=O=PX)If4Damdram@}X*j}|>Gvnk(&tkF>hxyzs?5krNqp^9GJC`0Z?^dWco)=aZd zjRdGsKC`WC@nl1EvD+6oB?AB4U)7}~H}7ovqD3GjyqpRVvb?hYQbLR$PVnKuA6~X< zqe1=>k^^}v&VI}C2)guxMz_4nEgbV8Htu}ULZ*{|Myc+*ZlHwa)>9lPZXhzJbR#?U zY`i~cF60J5VnC13Y7kML!ZX^yq~`V0_&(Y!z?6mY!?TMgjBIMup)dO3al(EQTvU`3 zT61_c3h{&X2Fm>^bTKs0;+AIQFBy4?A34&8pBj`UlWrun(}G4JI#&$@ZS)2hUb1Nm zPN!BAL1{>{sFewV8~1b(*|N8|P>Z@zBTecC*pAY1%+E)b8U(jdF^<#w(D#Qg_Gfp_ zrcX}SeI#hQg_dC>$FpyZN(#%lfsgzy@~1(7AFg?40iArAs zhg*O^S2ReiS&X_~TgBTis)%d0 z#@_*loXU$uRm&(Qpzy#;;{iv!1j}E*t4L*2Y{31Tr-9;?DZHh)fr1;q{fcWhux z;|&U0p7Kl54V>EtP%`SGo*=DQCK-2m_A*JWy$d;{*kL(xmH zoIvsH!|tyT>o`2SJ$W`cn=iOq)>Zflt1)13dHJ)S!Y&ilSxq9<2+=w2PFoG}rB-Ls zU?S}#Sf-y4x02lw5VDS_IZKJ|{KC zgj|i_)z%uy7Pc`*d@7~Ru#W>|zR*B3Vs(n27N>d47ilY&z_OJ0v3d!j8ue1jJiz3o z#I~vTRx8U0kG)q7#!XGcsnu|DsHm|u%8pX^`OezO^hHe|=LX`wsBz-8lnD4a9woV~ z2^c9+Lm4|+wLR`bH41mvon1CiVOYhR&@3GWn%_aF%Lhk5XMnCWl2`Jprb!q^vseib zIJ`i>0^ZPX=c~aOOgN8P8KQnsXA&(|Tp1gP^oLUF%#aH>IioQ$8TZkczrzmO`l$3L zmEz9^R9%ig9#CO?yXdFb87_t+EX+px>E48|3BLl=LPyiJ&gqui1`<32HeWW&MeN2! z8?%cCYwLF67ckCndxF0vfgy{vZhrmk+<8k{o#gmdI@_CDL1|MK*Kz#5^8iA^`04G2BL~)~gt?0RFGNNCtEQ5Ph&~Ku#Z*T zydnntr6f2|EJ!sRGFA~of@A_xip`3p3N>#7l@PC;QnAEvYW3&g5d@E4*S2rZAnF=e zRLXtI*+0^_BAJt@;u`Ek+*~pC2n`+KJ$NPM+w#)#JMtyICWPQ?ihV%TGJX*Yk99qr z*t=W?A#!iBwv@L_Pu7=c&^&&Q;Pa5$VBgNhOw3^Z`S;NgpNkIiXtYc-8oI*MuM<3K zM@vL*pxnb*<><1D@k(X-joM*iOIs{V2Niee5-s{R3NG@fuY(EqjXtw^v1SrI+D#;qmI5JWs{DI{NYTr{4~6!-GF) zcd-2N6k_8L5_A&eg|N7UOz9SeLyQYI5iuV zFrKun6QCzW-y5zFNo{ov&hiwCDMR)GZvNnaC(-k&XH2cU7`2xkz@;$3EjInj!qkG& zv|M47-*V72ZnW8ly8pG`qG#dC+U&{Mgkd>`lb|dA7NpFVLH2#A#=SVlYUA!rXSi7> zr~Z};s!M!4wSdE5<{sm#F^etlt&bP?bWwZZR!DN+ck}9dQ3g#uq5@2hQ`Alh3`L@w zVmiuJQjT!DwSh8_DsHad%H3(k;Bh5kd&aduC=wQBgx!iDnO3Ya-r!?+9m6sGi6h7~ z#K)`@20X)s1kX%*x-Ch#5G;^0_(Oo=4Wy*KfGy0LjFF)tt|))uzgLfq6z};WONq@FQJH#DDqyOB3mqbCL>rd`e_&AG zIXT2dzxAa6*>s+9MUlBH_9Mm3@VG!o;+&*2rx#U+5pGo9ydN!`gx+9* zJFS=FX^4C&W3a;gc^1a@npuY*ump=^81#(Rp)j1Ly=@T^{gC;Zymlu);h(x4b}E|{D>FM z^(8U>9HFM{ezB&oqhS!9;h?#+Tuhmmrz0t~XrknS(xrEny_t^J*c)efS$_Fs2|&#E z0?M7XhH~wS$iO=xkh8d2jx#W6f8$efhi+tDBa84dfiJA@LvnqjjLemrLdWy5gZDc$45#wrWqzM7SjNBajviepnT zEc!uOMo)Ii=91487sG0t(=m=dCmP0N@Tfo~7B$S#+&=h7W0%_5)!-a>Zf@$~(H8)D z(aF#Xw#48R2As`~YI~R+`^fWimk(Z#Jg*j2Lwo3eK%pv!6)RCLUqS&pVHxBg{{3Oj z%k21IYZ=xd%p5;dFVdvwqVfqvM*c2IKUm4{ok#(^{vZX&hYSE#)%h^Ob$68H{){$K zhEAW%$Ro@1`pQbO zMBrXPAQ6;(`NLs_I%7SU3nEW(D6x5~krDM5d0PUqRSxqZ@Oj)f2^0Tdp_EKA8uCGB zg1iJTsmC)I7SKV)k|H$~+?eodJ(4{pNG5(bp%XuxeC@B?Z*XuTfV~MK*YG1qXO~zi zvCs!FU2R{df-7)e9+JS(@)G+!teBVwZbM8NR)s)NuKd-<;^b2;hDh&{N&sJfdt)#d z+ha@uDc|i^kQ3k`e*vsHY!ql>o6!4qz_2dVj=fsc`krD>TU< zD06p7lSa(xCMMfsaQJ|cYEq?NXK13$_aeX5&?GR$xQWYu)uABZtH2tkQh+h#a$aLY zhsD4jU1*YIorBWZB(dy{h6-rUNBP?Dce{7ym?CnpxH42qK)xv~zk0?elZv#cX9Xm= zM>2jcC|HrtKZ3+kofXiQw=>+hB8VCiT~Za+8D6$#>5q$E$P8YEp(3KyvrQ2HBRuG2 zx9DUPIv~%^ztZy#KB_7mI89U?Ove8rbX*2o9d|gJav)ZCaT`ylICRC2qlV)OVo!WL zJiS~&S3mRe5c!xA-gaYGry)2ue;hu5pur z4z=@ng3>Oip<;=SU0uqkV|^@*59mOZ$Ion`GaOwUsmWjUAl<%kdu!_m0+y%*y6&LI zt4UD*{w=&)DT9v3qUg5R$IoyqVT>5mEho2)VtO#P(;&$#5+h1H*~F>mH^IEGlaP^r z+$e73kt3l7T<`w$VOd~?JP=xpMv@f!*t0j!m#aAr^8>2kr71)UwS(~@yj@`gM& zQi0)K-5eL}fi*>IXO3em{`{K`lPHU}l_-@+L5#E*5Q@G%Ilg#;-#xvBSJT9(RX zcDL7F^P_7Z&Y1}^&Eb8rEl+_y8*wxg{Pnk619dZi8L1YC{UsmdE?FiV0^2M#?G4rWUc+mB48tYt;y1$h7GZ+yuc8*3 zfMzBx?Ot0>|Cp{F3@n`t^hu{o@#``DYB7bbbLdH*VD9`#kZOVw%DZzkUFT)Uh624b zC&aZm8G17p5^5jX>kyk`8;flXHZ6X-Bo35@JBmo<{+$rs&bw2L<1E2giv2ahOxF#lL)V2Gqt|G7QH*hiFC*x9< z+issI*mXol9iT==zdQ@cx5K*sR z>RZuo6{pl@;HzaM2Slg}J5A9dF-nhY)Fk%`{W_W(fiTAElv_4unP#kE)V$CHMO56W z%bYHdd(a*5Fuo-&?OuB85ypXT+~%3<1?1UG{~keVBFWm*S9(W59ghhE$B!o9fU_@V z-LuCPD3jwi5K24N)uD+aXBR8yS*(9se&2`#?H}SD&?~pkL?wWZ!N-{yXrLeWVGXcS zeHAj8mW|(}L*ywiY#Y1Hn>n)4#l&6k6x?Zq`#Ka~hpov8c3wFT7Xtiqa1wa(EzFB= z7HqFWgaw2)R;u~M`Q^JB!UOGyD8cfBG_vuU8Dxg>LaPWWtiO4pkF%@b+vh`Qdg0F5 z@JXyj6=rpNsxAw^g}>#Wh1NYH*mN#EOC;b3yWp)$3OmGe5dh5^+kFm!4_i^P379`o z)FS_m9$^O@&HXEC%$YgtJm564Bhjg@TBCzwR#zdr1jp*mwCT7!!w1xU_W3W%?`61b#JjA5A!p}%YKPS}PfZ?x01eLNlWv~X3H*4E_|UPBA!{OhF+ zM%FC;xa;UNV5{OEnF;z!By2~gAtj|r`SUNz>IKB(gmf>*p*LTViO=e5isi&fQP9x$ z4oyxZmn!1owAUZJg2d7=CpZqEfT3U+_L!2)F~xC+37U73WAI%6$g|keVV)^y&$Flz z?RyU3){gx+4=n*viZemz2Q_9XjkMHGB|(cx^GXs!KNCKZ)B~!LXOQ!f;>d{LmK3Kv zrAB;SI8pg?IMPrFx{SE^9**Er%36^COT6^Gl5A9%me~Gc83e#ck+ifUOItZP36^#w zKjnBvDMo8FZWs_bOkzarNCRF*8+-|>5Ap^xLM_)iBaB6rPRIvG2NNzfq5z)d33{OP zR|H+^Sc=hy3;L=o&0^wvJ+WyCf-|hMv6L?-%kqW3QjS3}@me;#5c(LI&TLK(l zqsJ5dKreixLhv%bJSJ9?Bb6C2`XntL92%Mu+$1;Ev2NgXB}|j-w7lzNGJvIK!v78~ z4vrNc^%+h2PGNfye8ErSI#3Oxq?3}O#8%v3B-x}56ljyD8d=5lp5pG|@lQq5I_sb$ zI|W-j1eD2(dbXy#z1c4|Dq~ES5)zLO57P=soD~ImpLLES;5-aghAkEvYPjhf8H_ z_Apn##Y03zqf+LRN4XGEi>JBxGXsb|bwxDkEvsv4)-yg(b47+x5Jg}I6x&HXtb-f6 zMvw|*bkPij`}la;TH0pS=xp^<=uxKMm2;PF~SE}V*4^faAMkIDFENt~x*zXhCR*(+p1m#2xh zm>{wQ9wHNx4hRkx@$Tt*)45SLb24IXz@^2VQeyRnqCh> zsd;A!sAN=XrQLAQol9%v1D?%u;|lx~XBMRqD9=Sfi9;8sTERFdo+2-Fsl_SIR1m9w zj(NgA>^*o`pIHmwM*G^wufwi*%maOkMhux!W#eQiX=aSVQrehO&UCpwoUr?=gTsf2 zw4s!RXL*HoU08Q<4cveApXg@I^N=U0lBro=#zyd4S<#ms^y5G$xHtfg2~L`xX6 zkADU{9)K1tKYWAh9kYNiL;OYxj1K)RIV=(J)5O%|=>goLAVNG8|NLkCwiqH7Vcg5j zI0)y9^I2p>4abw4Foqc^!S*pnNV~2lf3jrk(+AiND|sr(?OFcHFJCa`o__9FQC!{; zgUO;df-Yl919T}m-*u6zuU)F8NypM;s>BE25Sgn2V$xi90w=S(-z8A5PnED$QC4Oq zh#SF+V>?ifE3V&ca>RV<$ds2 zs_Rw`NJX0I;0Wi)9j)MVw`D(KEol8AwKi;x~hF*@{Tc zU@)gkA_NFbVEHrNCL?2UuAXM#Xh~!+$hBQPG1^{dU~fD3$PD}h&o1gT%W%a>mjOvB z@SeCZ5`^yVl=2Zskc=7iG(4fmXeq_50{2yy36f<+j9G$%br`l*z_=xhm&4~d6=LdA za_(#l6I0cBt*D;7nv&AX1k^=q5u^E9(Nm zeE4O%7?VvqZ4be_2>@NiOSOSW7vJJO3K1;F4OTT6LuU%%bo|jeHi=RJbC*HbNb?W~ zL2|@UD@RnLJiIG?*=1DBR7~&&R;o#@d|ZgeJsG&O ze7sT$a+-T84`32-XL*UMQuxik#p!gEz;UtYVwj8*D&2qpZictRd5r?c%ZWlQce==N z2{MD@8hm_~D^ZIkXBXrX6i4TNYd!(Dmro=b>i{C)1bXtm51_L@xsPzH$q30%wIcV&tJeuV*HFgeJ(!k1EIeYTKyG1XkVInMXQ#BO@9rfD*3 zp61F>`(u)tBb!}Lg&jGz6%q|LMdW2LochaD@#f>wvLae=sZ1`|MwQVf_m0MvLV;v{ z(%sJ9osQI**^yqQM$Dh&0{_4P!o`PhP!1=mafv^y zNS?69uL9#CYnW6x7octuboI+87lV9oN)SXU-*HC$)G3mxh?Jzp?8s--CM6ZGkSI={ zfW4Fin0(PROIv|FPB1yhkr^Z&n%e9D(?Fg)8g|cX zlz4$5$`OkD?0>>ZfAg0t|7kEd!dTc3S;mz3dg)X8wgjbQdH^+2xJz!8s31t>I3PhJ zsv;%%pph3q&(1Q$xj3AFaTtyU1!O6#q4O8HPg#o|DMJjRsG!-4$E5W4(lE9zLLvy9 zJ(fr$4GvLHPY!?&iE0b!CQGoN+=Jz15QBgLh~Rb!R$YdD6-KB)t_;LRaw|DTL1sBc zd^#V{bG(RfL1Qbio3DeWxQSU8UitQl%L>kPT{iL<5Zb6K(o;B~@lP)_N@%I|#k!0C zoSusj4 zTtX9eg{wia3bDsZ)EsfL;AQ8BDBokOzgYHD79sDB5UoyO_ePh23xT^Ke`R}#=yf@8 z41+b#9mB}N^dO%3`{BmG)|`7Zv0&*1To8)ixbSCC;pp^>2&#EzX&*+LORQ7>@q|EM zI?BbRX8bF^tgQ<~Wg1}l?uq0`wo!bjvblW%(~rC(L9KeqCfAw)-NTv6bKE$@CmSfM za4B93-rF5SfcZwy%U5a8w<#;x+NLW=guq#WGAT?+14l)?r{?-yZ@n68fY(lQ%euZ!RN*8^ONmlI~}7o(dqJ+<{36?$e**u;rah@ebBj zdoNy=s@%ykUg=CC!iployC&1tLU0%}=SIwU40uei3sGD}DAns4>NVCFngfhF)up35 zNON0>Ou`)j$|rmzPwXd1WYxu`X=Sh>T^O6}>Vc85Wniv0G>vxV>FCLrSs+dkcRUB! zB&N%c9fUgYWsg)H#qex5CToe;ow&oQcOgsr@N(WdMPd_xD=6OV)BH|vVsal>2KY3p zWrfpLYU%bK6|0j69~o04m$+wa3hl=NAVCs*F`QzLTlt2BWgzy4KI+U=Tt}EO2DKBG zt3FI~5afXs>Arp)%=E8VkKqVc9YCl;6DK50cvn@l#0}W6gOO6{`LELORRpzrnO!&C z92766Xr@G(ZOGZ;F^^-`6wZ>{mh)x8@AK@HLJ72HUL@bp>Y90Ft~nXR@Ym%rzW4Rf zME!5>Ci^;ug@1d^X}YTXwxgHzEv@9N{$TiZq*W!l|Z4^31DlYFg%va=gRU zlHWi}4Gb@EVTCm79mV0j4~GPYnS-7fFaaQvjb!bf(Avo zeDR)Z962!sd?!&oV0$H#Ku-h|<;nOSOFJ6Ut z{VQ0?)^@Y(!77Z?CrgR$9-wG(tn??a!qGMku~)c-sIoy*@I3?Od@PBid*sXz+{*56fjyFaRZ>&Fjh212}IYlEmgN9LL}Fl0MbYrMeX} zI_CCx#xi#eor@b9anJtiVbaj==$oZx>n$w+2&Gdq0YSQ>wRg@#F6E+==c|Bh8%37q z;?m|%y{~Atio17(`?q-4+P()88ctSb+`mt_Jr&58h*vlY(}x2!)ml7!Fs8(2VXcaw znW!%pujE9Za)nDb|4B1k)@g#7x1eJu`+gTqX0aEE>#G;MNZkE3HJO!Co@PIwCS~?x zCxw8{^I^=@LulfG%hP0oe)?$cT?mF9)1Ack3L2u8S>Fi;!aw|QQdi}*=%S}$kH>$b zNVBDQ4dH2Ut}pt~6hx2){&uj{DyN#@4}FJd1>Xcb5cJzRfEFDeDqX>iz&qC1^BLc& z*~uB&75(!5%9=K-A_-)!hzNwK$j1o zJbf&x#KZL^ld9HRLdL-Sn)b_i2ovuBNL2i|9)te_->; zMQtqzoy~vQ&6!C(PX2T>y+RdNSUp$^D97RpfFV6LqJ6#tALj4X>#Qu!0 z#HHfmv7XeQQk*61FcQs_pzLf76~^W@k&;l(6cfn2#~rBD)A@Vf2ZtrQE zc}A&U98GY$Cd6SKQ*xO`5Bd~s1C)dI5KtZm6?lwM`Uyv$j1tJU(x7NkHxbrns~%GR zQtQM`Hkq*mIgV|C9SdWP>XCgtQvi%p1Ulk(L*TK65(Vz$nI}9+{ASazEM;qv5#Hwy zIsm~LYa*C~za=RY^5HK#@c#Kqe*6PlrzVcocE-};5x*`HJ+RQK+dn@kMfae-{`RxM z06)i&Z%^`a3hw0K87 z{iRFfun&#|;xD)$A&_e-li$XiQ0ch!far+YCU<%FE6Uw0i2>cs1kvLT_IbcviLv zuO4_ST|M28=xWyp%Q)(p!u}iu(f%D>n!D1Wp@M|MX@2R0#_9|33-s0`XLp%7TNpstL6K(`)_~}R1dcz%D|;6DRsyXJ zY0*>^M{}de3om}dS4u7+-g@c|Z47NEKW$VC!OQo&Z754@V<>;qiCmioA!bWlh|&jJ zx)nn2LYOb20ebLkvIhk8(Kz12#qv5Z*J(WBaYRmmNj>d9xQLW|_}D9g<7zmDlR*67 zO^Pngj?=t=4jK=V#~&6b%T#WqLFCmaNBTzOP#yU$lq{J?lR{jsvZGxj=eGL&Bx)kZ zGAd=^!x6>N0(2?Zs3gJ<0XSC}v;~}zso^65CMlRM%5IFm#1vjrZCUpW|CT5m)y5n| zN2Y|pDJ7?0E7LEFbJRdDw0|LZ+rLepu{}cH&$0@KJZh2$wWvV(7c29a8u)(H({y)o z2CoRTyd6X~qQCGetpcMQ{hOnjCHLSfNl5i`WB}+BI8e&~pci#I1NrK62B)`%k6L<- zgGKt5In6>;FbEbL0_7Kq%kYW(%E~p^`naScjo;xzxH=FR1wFMibvGqhE*7I4BX+17 z;HXq(q$~kR9_VFI*&r*ZE8!U-LEbhNrDxGHnOrV7B(ex@ctVO~*MDRgeNa`|HXyyd zs}-K?f{HF*tSSByxNvn!c?nT{NT?I28uH`e_-P4qRd`$z#f^h-R0s|H4qlsDCtDzo z@ey145v(8{Dkc&I%azRrBI?tO$5XsGGSY@Z&pJ+r{INR?{e__g!%Ji!^lOK40ANu* z#Gw|Np?9CpgoW^fce>1bv9|8G#&yF{CKD%|=C#l66g}eGfZ*J*>c{xP{fLDC9k+2G5@e~?{9 zguY~K2W&8gA2XZ*aJu2R0iK{G4TsqGCLNZPA};+VSAuidwBV$V{8*AVz+;bAKeFtuy5C{>3zAPzsXt&$us!at+A6mAsesuD-^c6tAOD~Q>3hrK; zeZHKgpIomO$_4hxyAe30R5-Q^N;*r~)@vz`NwDO>Q~QtzRn6`q%M@lKKqK*U4kNt# zrgiHdj(8_RK${51KJHlPHzMryLl15wsl3VK3rVKq+>Az#HzK*{fH;{7ViNI#wPV>x zz@Q*HX{@7&^K&iR3~(V4MjpyQCH|?Vq(Bjy#amdw@6y=?=dD$zV~g+uS;Q$NM?NVz z@dGdVUl0c=wdxbnx~bYD(w1OH9^&PmGfOYBZ=Vjim7*JwQ8`8~hcq#zG{^43D+lZ8 z2}FB*dnW>D-o*q-vm?qF5s<@}Ax~qGYth~?Y>=Xd87J}46b#3jZ;q)8O};ejdG`gO zyC?W1BONWhpC;NS4>q8u=?OLeR6ImbmG5`)W{ra{+*f9&IHi(?_#5H3;GM;TH2GP)O z*YAs%AYXSU@$(3dsk0w7O_7wRWhQjX z$|!6vGRUcB#gC5NIg>)=#bPdcGUhgZ>;z%(Olp+8M8)%hDO7w2Q=srl*n}GP!SXg< z^H}R!!TT#s@YyK4cC5Xkr(LG*o_yiW9HdnO2E44P-Lp-{ewP#ltAZ5$_X)x`W>f0U zbeSj3hlCS6zRoH>$iP?ov5<5;^-~48K;v34LzK#uWnh4UeL5BQ;q2J}!|LybT4Imy z)k@KNuhJ4rgUuh~2zAN*4Stl_8o?3w=FfA$9u-1qtg3$-CRY&nABNHvjBH}!Jd zM*;&4jz*8;HmunIGLX4+-FzFymj{$z0bsOOAQD2gC%$Wcp>D2o_n{faCeTS@e%V z4-n%w=5khu+J8LWu1L`07;VcF7N~)#+^U=sO(9Sf7!6UqEfVqk`9pR0@psJPH@O_9 z!?Wr9Vikd~8%lsaBoOgPwoNt_w>ArrJeqNl`F687NKA_wXL2J-OgL9I^4+%^osM1j z-!wWM$E>tgT2*^oIye3eWdE~UC<5u#TA7o6{q6MuuOamH4zuN0$)*e$r%Gdhj7{ZY zpMSf*D3YeY)m<9dx~uW<>@F^S$-0&32}wC?C&Fh32x9w1t`ra?@mQ8TD+V$#Jq#_29gCm4Utk#9|}bw1Q5}`S{h6t1s=k&xelZ*3ZxoCl&Pmk#A=^0~=o0tR0{5ob|G`BIIuaa< z@|h8HG3_MxL+*xm@gi8MaXR))ansfgh^-gbyeKMUtgL4gWVRN zl`sa;75ZwVoNvBHWe-z$3DDa|XBXp%{ro~~gikGZEUIV`F<5z4+e0}Ye77e5Z6JZE zR<8RoX)JV4a4Q0EY~YHtypCku(QjW2@n9Zq5k8^h$`q6vcxLek^g0a3IDo;M&P%pq zdX6m@Uym0US)rzWAuRt8M+ovkJwg)XznI{-M|WARC?^yNYv*0VcPEvpv7UMPu-af| za1+IuFZePQ9B&yxw<&KT(R69hnP5*CAGLJ$nsEKcb8$atUMGrJbqo~VLm2k%yo5Vq zg-Jdgu4q(ow(&3L;{dM`;FF`~A}YFGBETD-c~c_p+yovxA!ewL??LI3;+^dbU_3@M zO&o_(tAFeMqj1%R9AoOdd4s>0$M(Jn6(SPSX)fD-AXoM1eGfCy??% zo|A+#pd?rn3=sJqoRaoPSS6g0VIkPd}oSE9=ZLKnM+pCM`kZr;jhqK+x@YdIj6v^@| zjto16g+=#8-uDj3Hzp@p+qm)8S3_IyadT8M9ns6Uc*>S}l}c@8s-H`$JHV$J9R zc|(;~;1Dv;f7#B*>(PVx^KhYmaAhSR&JX|M#6a--jCqXZls{vlI9pGeKxLX(yzwsb<;-si7iM9+cabJ-C8c*YA?+&nI z5kd=Bp2Nvr#({;7P*Zs3|2$FD(Omzs;b3ItTf9ax9bHOoU6=`(78rdzjbcm$iIoF6 z0gDe-FUpkju1o0`z{w2@m556%jF;>wpmj+ zMZhwg;P)r&pv3G|QLqz`MPvb73BhVpie%Ved}B!n%9JKTmx69CiJaV@QWz0$oOVT( zWp)kHMigg$izk2|VDR;XA3PmI>@ec=Bnj`noE2msmS?UuW;mPApI$8ZB^@?;radpe zx#AHhx#IVINPHjqIJKE;$IJ2|@pLxh1aX;kKyLhXz=LVx6)#Lg4ig;am=M`R=-?^- zflR||wQkFM2+p;Znkl&fRB>` zhI1L(p&7&-vGUp!-+{;SQv(sJP|^^oPy(`qDdrKTY$CKGa1KtkXQ=)Z&+Ox`>VX(& z)DC+Nh8fRCs5uMgu1+N>cO&FWZf`QQ91-TyD|s~@&$0_ZIF>Qa4k)8{u0g|KKKPLI z0Z1=IhCfY&gp@1H*(9nG3YKY-`XRxv37}Bc9TT1nqaZ44L~tTvS(?Ys(WN*E!IG`4 zq-w!=cS?VVTC!>&gbvCO%XyIpgYceI7sR&MuDdE|w^vry;9Txcg_U@;8To{sWeFMA#LXu15w@>_HhyyAeKJNFDz&KNe#5B(#1%WfI zU0!Km4xVq#pyg?5A5UE4h%>1SLA+5}nuX|#`pR-<8_KUI$kK6ZQ6cOUH)~lvC2CY; zI3FYXRTsV;lC>QNgLQJp`F~PcH z!W1u_6-U@=0{*V#_EF!!-Ok zOv0^j8P@o_ie+3kithlujL;i^Ud8|aHH2@p?o>y&_I=bmM(!6eH*2-r|E#&U(Y`fW zIS+XG3||;TY4IAVbL8De3EgscrQ8MbO!2jjc<<9glr;x@9!B^dzts{c*e9$1-D|*J z0K1lYIC|kd{yRkOarhV*JU)uNS3YvO8QQZ32GORVn;_p1sU=Dohef#ZEA|2}I)w1% zGhp!u68;UJ+%@P`&|e7tYB&bwD%w8B{~t?93*@^D*H8-kwPYzf5ACbY$^7f^9RE&G z!qu>a|A+YESbY&b$A35Q|FsZ4evGoFfWA`Qzq}CY@b;(3oBj{K@;-*Qm#A@pu^D0v z(7WHR(5GXR&bi~bPtb-baGXE(PIIjAeHJ(>;T_VX^b!M!)rglyQN)uQ>XcdG;Iqe2e45xsWlQJVxmp=LP;#-ry*6bu0hg zM;*HQyS=%J9GsssnG=?-v%;398m@+q!j)fqMDBZ+ef1I3l^@G*~=B?a4any zqGZaQd~_Zl#TD75=*-0pZ+ky|w=dzH73v?NN9-%tcbaoArJ{I;v&z-!vLd`clKE5) z+mVs6ng12nBjr{2TW?*?ODapwWPE%a1M&=ocfwm=N$bc*Uxn~_s|2Uz+%-#klUz5I zF{KP)iu@Da{>o;6ypGb}!2f?})xa52iK`satmUTX^iiwls+n)+<@sLP!@ZZ6@k)L8 z)d|LheGG5@Nycai=^5UgW2PxX5~qi^l%uDDA?J41`+Lp4{^}V@c%!C z@L^fMDr8?lF{6qSKG02*lf=!LTfd5Bh}KVPL4Qle6UMVJHrdB(1pWJcWrfkUw32K} zA!?DJeYn`B@-^l-zVG=S0atA5A9QEy0J&5d z3GZ|lO<29!d~|2ITaM2*H_4asz=894+CCpc`P@g&q%74OKy_<~Q7DyGjKv2#=-)le z(tWIgLnzz>q*>koLTZ37<>Ty;UwT~Pymp;}b*qu}K`jZsh#a>KjzJcXSH*1LQL zX#i22rh2^0tKkIn%1u;ZxmLn^9C7l&4@j$;59k|c%kB{{6sjzZ3Kmx#6yW(`1^S&sq}@EC`4&Ft)^vm&gCoot%eSiVTPirju)iF| zs;s7J)-7Lpa+5tFrsT2iR>{#Lj3$EQ`;hr)266=Q)(Q55k7S?fwsTXBNd;FWy(;r} ztWi0Ne8PH5r2~q&tn(z7y1ig~xOpSS8e>~ZdhZ=df%2OxGrKZlqB=nu<``XR+zVJ* zs<)Ph-7%tK0#1G700tNNf(ABgRi3zp-nmJ24QqW1^5GgFRH(x5oL5R zrC&k5U_TY*>Ip`WWlL|c!zLc|RcZ$5hdFLw@@9qH+#SO&*sAb$k|V;wZ>v42F+MpAiRV_a0SgPm12sId-}RU8v)3a~ZdgEWR; zp{+VYDuKgW)aGV@i2?Cm**4t^!j-W1y0gYoM^clv(D)k;1)t6E=2LuMDp$Pm0;>c@ z%P$oczIlkTy$-j{7Z_QEB{@V{e>MC){^x2|X~o`fJgCuLd4=46?9UBXQ>wdF17%W@ z0?H?D{C^QXV++22y)wEI><0QyJ=EQhDDl?|;WV0J9NT5EJ?EPPq*Y$}I4K49A95_Y znls+iSz#n(pN5FFEQypo@nWHsa&R1S9CHfNo>B#Bcn`9+= zaIm=+pSC3Lx;2!mER6oz^7dh2@V~3Dskh)J{sRB=+t)uvX1KYIzLDwg3)gBfD(@yI ztLv!Y-7QFfo0u7QJY&~_b@3H-gkL@fgJadbd5SqjY$d;crMBn@dPY}H&=EbA8p%;6 zH748WCs#2`QVH#RH^-77&X;u_5NCF`D}ZkJhFM`}&tp?x|c+-0C^fkm!HhTzB37S1x(uxFpRtX|lQAB$nc6 zQ`=NaO#8OVVM-;{Oz1KC7<@IucyY(qeV^;&1S6p94E=vcy`A*5D(8jYl`0a)UL|+p zs_+}uLtf)*(;Z$%mGxl<`iE_l$C*<7KKHPu6}_p94N~@}|6UKvrlL47xmZvYoxT1Jo)*_ibCg~>$ap^^GC)<{g)~Y%cQvQ(-OJ16SgYHPBgP)NshrOO8IHmkwf*$3+KJl7 z$;@>Vy!*=MeOySnK&h%8L7j9x1oLLSToVp|cVFZeeHv^_UNdb?^0iJ8nW&=;!1tmw z4@Kg@n$Iln+h|$NOyToepdOoj#({bzi|s9Mk=SZ~I7FY_zsQ!oayd9aPC2D4v^DKZ z9Y4`;N`~B#F`^$!WqkOc%lMf`12vU0m3}2K!NERyoHXIh^X?L#$M3X2)r=!U(dwPC zyf?4K*$NwFe9FbWlH1p|AlyD-~GKNbDvkm5i6pCzMis<^cZ(kiJ?}wVf}tr_sV5m()h~!elk(%Q9u2^hY*X5UgMa33?)__H_8Q@2J3&` zTDfvr*Gso|Un|?IPdA?n412wgyK9NPri+-OQ8?z;+AAu->LxV@e~jaD^DAG?zCGPT zDLepzqwX!5m?!cLxAL3hYBkZrJGucRQ$KuP_qNMeX?odWb#nXaP^pv~mSOceCB81x zx8@z<{!gz{XRC~^oaH!jb@v*zKmE(=RJpl0uHEjLA1imi%1cBoPKOvU#~sqGYh@hK z7jQzQy1)Ao8>c?cn|&3E>`<8s|gMr5b<-6SuNGy4F$cq($h^_#Bcns;Yti4^o8s_yPcJGgkCTw#R5ip_a6GilR^p_ zTGigd*U}^ZgZJ>OnEzw((QqN>`tDco)zq{I5yQzwYdpfdJ8O9h+j+W+t<+lc{9R2M zOZ~~ut&gW5s-<;HZF)}{Vl0jPrhcV*y4vXe(h3p8uSdxyIISbg*rG7QQ%Oe)|7@ zPQ|sWf!%jaUE^4}=_H-q0}Ef~bl|qZMr&!@*)`;Z?o$lY+v@(LK0?zi#K_^-;i_`j z7!=jgHBj5T_1J`IoBCB5qL0%XEb(qVdYeu0zOs|oOnr15Ic_IRxg$6HmfPeDq`98X z%@DuLZtsMTI4>Rv%#D2y>F&nF<1-h);ivz*9zbSD#$PT3Xm@a$S#-`$su|IGeLTF39lzLCw-*nJ5%pFaqIJ5I7zxMero@4!Vm>ePvHYXcC$G1D>A3~Z zhEiHhdCm<_ELH#TXzRAr|8J@IpKpP^n%do(FiguYzCu$O0@FP_t<{TOSLAy-oyi^( z1yx*e>BtwH{}venKRqoI65gh8r?Tk z^KbBe2vAN7)I>djctS7rAK{hj&yBrbB_7721ICB#+uq6n%cDA~iLx0_A6ulkg{z#`Md!Qk8 z8k9nQV?NnWf4u`N+tHby^G$W;IowE~((`KTw9AKFqc3Qz{q*1ZEA3{Y56hQ>pH#3L zFKa}et7IF|hOps#sgYHG`hR|Iv$%HC37H-MzuFk}Hxr}v_;uRjx()?4S8lEmYxn`V z5v3wbw~xb9YgF{>)z@cL+|D7OFd#sIo9b2K#zKT zRl2TPGnV_hFeX3!k5{X-Cm1Q0UaZ`ob)GfqHPk zST~PaXu6SA3SxD@YNRQIf4r)gl=J!;9YqvxG0^6hQ~Nh5Dk-#}tNf;>{}^@wE!<=% z@~HAqA7&gjl^q_$u-1RV|ElUxC-&u7wnsI6=VNdrgh09ZB+;a$QW)ud3;N|)7XuYu zZl}8t(=l|h#3=gkpElL0o4<>~`Vay6A+F0dvyVCVvG+Ou)vJx8N3ldYs$wYhBl0Kq-H{qpao|X@?fDU4SD9*;@&j^F{hW7MKnZ#~b9l#;48@I=4yzvK8S%|ZA*a~wrFcm3Q!KFWE$eGxwHO2%>&57EwKT!r_# z@==Tx7&?c%4&BhIo-ls&J<6y4_!U+4PK|7a6fS_Hx)n5(*P=NX>5?vB#$3e zFR}xe?>)C8iw^v)pK?>dNEfuZ=oXk*{v`zzhDO*;>bwdv4qO>LpzZNGbfLR*%=<+q z$xqV52NY`gJ2{Lk;Iv?Had}U_1ENW~RGcWX2IzM8(dx~CPcLgd#_SUnegBJHq~~A0 z=)=E!mxzBqv%jD7Vqm4(-ihqt9dsD@)ki4DM>M?a;y0UzD(@cZ<$QINgAdZ>ok{_Id>5+7 z5kjyJGd}k%MERb62Uluan+ZJ!>4hY@kPZJO%^58xyz%cLb(1OLX7e}jfBt)!7uJ)4 z9sqA0ht{?(MFWK!g&nmUXTGl1O_4$7;Nswp{y7IX6JdZeYsw|ul| zI|i9ztsk1<+j<_tkT;=yoBbu*Xsg0+zQ-3wh|7-*vlPFEI{grFv(Jc|TBvqeOBWz} z;&D4%cp72E8G;yji+VSgw6r6O@Nu{@CopD*WBJHh|)4qyNE5P#_HTGefqF&4>dw=8#uiA z@G8cW977%|PtP#2zh*m}t9*q3j`ox5k7b4${rf%haeUOe?kT;}!wCCP z#gzG==%TGl@mm(vbihTU+S+||ftrujkPp$nbsO}QiRQD)ab*GyNaLytMRAw(=QXHZ zQt!YtZfUhkP+9+a6Vxur+rp>m>RyZdct6RPolJUT@bF$szJ6LIh@60*#eJ4s6+_PU4A5Fy#*}iI{rw&npdS>| zdghK4-noX7@+k1|HkEoxW$hvE_SdVc-pu;chO`M#kaA5YrGV4R;pK+Mm>X)!R3j*Y zX%)D*X4$fB|BC8{ydn4ouTkSUW^^+Af~7E)nS(@;9p1nrBfp^P5q_!h&U8Mo!_FMx zBOL%wy9npN(Ky#l00RBp6!&#xn**Qq$#wYpyf=KaTTpNV@e|mt8r5Kqw>&&mnUd{( zp4-ZQ_edZVAZ|aaFiEaHy*kxB+k)aF?~KwNc8)Q_*iCgDlG~7PFK|@ZVvei2MADOZ zHG8Yf^^goYNNFW=6I6ZO9@IE|{hGLuv5)+#4twPuvi=#>61<1$E!WGg;c>SX`bpRi z*SER-mU+mPo9hW1!-5yWSzhK6jy1NKmXNv$&AIl|f8UjTU$+bGP&cbiY06q_9`wFb zTlMvyzrE8ft=$lL7d0epcaT}lH~qfysK;Dwqcp?(V?Co3g4(WJD5xT*B~YZN*O!uGg64Rt75wr+a$M=Y zoQ+juNhcR%PTk^JbrDjmcg{24 zQ&uTHYEggXpSx2~k4vjP-Ev=*F{>T>cMD;LB*gg;ih9q;Y@CtsVVj1#EnXYms@r$)H>>N&W9Pz13h;cx4FY%7^i*+16M=#_`ikI^GO3>+Gd!suqiW1MbHs&1zT z`;y*jJO9D!@oEyQTC$EM1-6xU_;7PTtm(BP^DW?(iXT0 z^%PE0`>)!PdTa4|>54-;epkx>=5}|;@pp@nGo9br$rTj0jns;8w>7QB>enkiQALRs zXI(DHw8PAwb!AW zC>=Orbdth4{G{u*=+;RkDp|VpAoy{6n09H))Af49sP=NVA?I`T@VuN{lO74AG+GLb zD@f1DFxO8u*VL60Kf9hc{e&JSLt_?G-|4m{_mRJNBByGedR{mS9AowpZQtJ9cA7$Z zJ=IGoWfe-m)Ae0W&s&nltm|yoR?&4;9%op~zTaG~?o-MsdVInYMM8U9y0f`N?%E!> z(OU+dI%7OOpM=%l*5RQXQ&oD4}vg^&JQm%(SwH*4H2XR0B%aO1<2apSo*D`29 zk+qYH&XpYwOx>*VF(i$r$=^e9U$Bcp=lrIKzw3r^_KTi9V zo89tC-^Is5tL5Z&=#|em*UK6jx&Agk;o_xJia-h<){`p(S3b#ozIDGSgz|UquKYHQ zv6ib>g4Fop(z^0dcP@MAZl*bC-zM+Lx4SKT=t?kolD*S~siRF1ue{c4fi_+bDo=a4 zM7yOWL#f(~Bd#lQIU9P&W zdu#`jR5?XrI%c|{?QYZUbeq>jWS!#Vo38DtL$4xM-7d}&K-gI?*vWXi%=ef-Sp8HEwvRS&U1PP z)gA-s%gfCRmGp&?$1Bxk+uHB3y5kz&omNlGUAa#28tim#RNXCcVzV|!8lsZf!!{mY zXp-tFn@Yu(17rK{F-(f@*mc)kxuM%@u!Gtp^b&Y68=`C9G?V=;mZ@x6t`d4bo6(~r zZhr!m?go(hA=3ZbK$H2eE$yqG^EES2lutCSE(eYwcW6xId*622}tY-uRO z&v0WSn%`jeIQtWQV77QO?6hq_L$yR`Z=d57;QYXqhn~U{&`){wnpfia?)n&xzP5Ze zx0`(3>K82Xotq^Zd@uH5eA`oT_n-3096s~Ex)*LO=6eOl7I>F?O}e1E@19aW z7J9=KX#u-;b|}nT<;v)kMsu%(^PO5)n6tF-TcW1Vs2x{dQj`1_Q$o=yF7CuDF}l^f zQR|Uw#aJ>SBhqV#3&rw#NH<-}C*8pOKRD)b_%FBXa~WXpkSI{VSw1!WHw~15!Ug>D zn4&GLl56o;)XP^f-8iElTvbBD?QW>0UUN@D<+^B^d9GMvmC2(UXUePbsdx8sG}o&6 zHytBi?xvoDrgaJmEtk$pQ-icPIJTy8y`-Vo)^rE8y3eC>!*Wd#Inu`^-=-@)`b2S) zgWXlA^tj+%8JNKx;Kris$0v&s3{CBeo{^)93ur6fTE2L${*B%i@x6@JVrNaHX56zB zjXHSn%gcG?J0(b!^uOIhv$d%^-tO({TZ7i}qP=LSvA#V%TIsULp$~VI&#$O~+A6C?_>rmQx^j8{6*N~Pg}3-ZTF~?oAK242II}!%>K!qPmfvAA zD3jbaog+1pweAan{L&wh(e9yK4lEkgjYEkdz)@zp= zXJTO(T@IC|xL}q|1JSOleAQ#_BA4tE-^#5}DNi4-Y5$ea*|J zUob`IlO#GJXGa@;xSOz~r?7~+HJ}7g<6azBC1D?P7XvwoXYb= zaWJ0=9-8J^`SJt&#yPEXfrc$#5mT-QWJmu{n$T0l0fmhCEV$Tj;!;sKtW=j)JH-Fx z>)hnX6;9G2@q{DwJn|3F$5$qoLoV~Ja4D~2i^g$zVv2Di+A(Df?PoQ0&zGOptp4~) zty)e^X)xb}s5Id&&Q|aHWd#1wOlbqjkKdQ2z85d|!-lqgw;u;+E+;EcGUHsOk+fG| z6nxZ=O8VGH_l;eZ8y-T#lsBLET98#fHc;3TH-on*r)}=OU9h^+_bojd_7Id8K`N8? zm}V4Z_A+-CbtJ#OG}G^#uxwc2==9OETtXbveNHjzU2#&G9%V}biY{}Fs~z3G3yz{+ z!J6(J56NkteUt_%U%`UcE^RINOEJ#N-D7+gw!?m1FuSiGDeI7{K;_fp-6gx=e)FCZZ%A8| zZB0SFW=i5=E4b`CU2u%5cis-S=t^77&ElNY;cL%^`>y1J(owv44UAj5kuI+Dj8@C+ zPK{B^Pd%XN?L)cJ7m|G~^r=VO8}ctuMs~z!VF8pOjThDHqK*-#$C*2vo<19gggDXb zk4|q_EMF~_6U-G(;cAG@ceZdL?Pl9z$XHGU(Cg#YS)R{_if$Iu#7$;!d8q7V5s0&9 z6S>q?a*Ik$-c+fuX-flIB)IUEN-MnD{pM@H>a*D`DoY=qWdO(NrkM!;ykf;!}7f);$V%LalD{OeJ*P5NB&+cdSS~N(Ksg-IS?!fb&knH zpXJ(qb%>R^Th?1kw^jlBJ~t9v8{~fz&H5dRyi&E@JS&4vYG2M1iM+xhTkp_(Gi1~x zN#C0kS(I1mTJq1v-tk=KSpFHvLHMQJED8_Ia|A>9x8^t&qf+Uk^|cGmN@xEWt^ zuKdM!LJpae*Pvp5v|MM|4Q`aUkv~mzu%|yq6QtcY&=aP`DoByEJRD z+AbqaxRtecS@qcjs&6~WuzQx6_FUWThfdAz(WE^3NM1$tUTJ2OTjm&+L`b5gipvv^ zUYAfj;T_EqV13EmX2p0_Tt%ykUCZs%7~a1gHf=G+R?_~cS)ak`Ox(~|vsO|3F+OE_R@0Dx7pIfRAF*NxSSViOSXE#U4#(kgN zD!c#u%~y@&IgI!2%DUEQ<7Xx%bebh-Mq@V(@4q(IE4pjB0F=$LIG`v_9|c!q#byxn z#@_b!vZ;yA9kL}Kf-;%|maWogVYqW!v#atzQM3{-(D%Mg`6#|o5iA!A4QbI~E~Td0 zdf`Uul;P8L|B>u+2Nbve6>bJKz4#Ja)PZqyQ`34Ky@l&T672j`@V4`dkS$NfAn233 zgS^W)D(`!VQrGRWka6VO4T{Cds4;q79z|;kJmM}+YUbR(-`3jO&B8JsMZPvhxpK`e zZ{2O6?!W&wbSS%L3S2ejxV=!gKV8~OlOs-~%K~wygXmV7R2!W#ek7*stkE56#Yoj_ zOINx(j8QN=4yvBz1RA*m8nBd~q=F>WG~YK{9euZD%osk&C3 z+RHlkbk%sLwIXgiqD#Nm&q?WBA8oie@pQ(y8b-Zz#Qn@CaIf7Bel^%G)n%u9;Uvv( zvg*6Ua3!bvpITd`>HYOR&hLt~*-(B}oD%aSh_#4UYs zk)&8cz~K4Eew&hvC?DqV~ zT$6&8vUD%AxUrauLiF42g{a*S-G+=baYIGwu3IHry?@oO%dV!Zz?E*k!zQY|cuCH> zX>d(#XP-;=cJ<0lWu>~8`vr^k-w}ol)q~OWwQgnHowJ}*41ytG>+;-Y9pNKdJ(jD+rbowuU& z6wnI&c{Pcm&i^%H?E4g@XQd?_Zg*WSN8P*~HMQ#Nw{lpf#BwaDKmC6k0adJOGKC4IHWOq_ek}6 zkIG^Q1Eo*@TN*75RCX@?oBQB_YscpE@}YY8=LL&tW~DJwL$R9SzT=|z%5?hE`c@WV zas0I(1NZiwOcDCzzg!8+elY$!cffzTQr%?={RyQ1(LF}%?oIdoR8ow46h0R>`&l%# zJkA#-g;I;%GfK@7BpEWUpkcmw^V{SWoX_3{Z^PbKePGtmUU*O?)p7V`;9t}0zh>yW z`}0WfH4T3MsN0U>=08{0Q*4X#0k&692*dI$sn;}tBFsLnT()}^M!p88u?7rzVMqyO%? z67<4NQTWc>l<1aG@rc$sV!vGt}OVg z4tk~8l?b-np6+GC@(e``;6qR`Z;isYoFTgyf_-oOMfz&wl^{oty#}_zT@oFm>TvhM zLuA`!uZ0fp*s=?b-8;h~7?(fy97=Sv$#0Z!>$zgzG+h3%p31(mLq~Md+@Ww*YB(sY zbur4Hv>&qX4ne0<9O$E|=dPE}!fJUR^DVv4Ds-()xsn$}7KLQJTU!^tnacitleQ~C z`z&m)TGPG#Mkl#l;%aBKf(x6uS4;I7qyF=*E(pE0YXK_?ki(EYEa+vwxauz!mKdRj zzs3H3I`HKx4(4D*tNy8)yty%gI#S{s{=IL=$;v zc&b*TuuxKpP}EZt&~pHy)Ynu-hVvT8P3s%AHPzZ0iVm!-3^bDV&l-~xU^FUN)e%+d z!4<ncAy%|c9o;>PahC#I)f65>PXPE0Weu z0-O0aU0YEf-dwF#$2U|~jzo~gK{b{?o4Wx^Za(+b4u^fp% z7zvZsrLNeIL+l@j{o2$}wE>8iyiEpJ;jBrfq%~vGn6xh69P<6VmbCU-^8*g{+M8RL zd<^t0Q!B0vy+FKF&)$q`n*+7r>cHF z+*LMD7kjGmJVMlTY=921HN&7dH)Xg1Byxqtj3W+kLSA{L9AVu8OOiz*Ktb{)R+Wb> zVME2TSmu6NNZ3$u95yb)K{1}TX<3?LCWnW>eVR~`-8AX#F;e8MP#S_9Wb@e-o2$w? zhLjSu1VnzI=!VY3-E3Vyf9p$ZcDtPh9J3hDHX5eZ}Z+$6!#DQdKypc__O zBVxa8Fy;3X>C7P%vJEG#cd2HLq`sM23jNsrhWHp9;Fj2h)^P^gLfx>f^B6=xce9P+ zwdU|p(s?oIyqt7iO**e9oztcQ-!Q!@f(?SjYmEjE>e~q!-jKEBnJ4rFkZjnjS7bu$DB+Qe!9fr9-$3lOR1EP+1br^A8U}q?x zC!>`3FG*h+Q?uqC9*`c{fGwZ_WJ7ILDK3(uM!;>N7^sdCW7Tx$Z7*x6c`^KSeJCp(}Wj(TV$6n0 zA%HEJaa{sPj1OP0@(e074m1Iv(F@ch!3Kb^DOCikIXnm!5`snvE4_Qldp#+7AHo=! zY^<@87kMw3NG(##T5(24L!acg1Xxj?s4=uBQBe|;)=X|AwJuAiA2gk=(ES#Y=@!J5 z$j-+WnZyo_;%;W5fJhLz^aXlM zGEQ#ob?H*Vs78*?WkN}|MHEnQ#T31qZ9z-bcz~tGk8DeA?RXVztpoB=uqIK@w$v*F z44KXLZw7{|H8RyJQf(*r>4^Uc9 zK`|R~V&eMY6_d^M8O#s*Jp4AZ+nU+!O|!8~^#^>UUD9V9S(U-C(&LsXMFswx=z>%O zPFDn=O=YE#e&Vk^5I-m+(CXQp(z30M`pv$vZfc-5ITRTvK37+2 zN&2%S{iz%BKWkP7d2iH<7%P1@4BBjeI?9N_quHr8JL;NRgKoHcxKgFl?{3I?%{$pT z_ioUEDNvjU8fY?*BDI^v3yns77<1#rX7*jd&b~{s3H55MG{rMcFdS9#Yc^arqE_Xnx39!A<~k$ilzCp9)|k~NMF-rl1`hbT@T|@ugsME zLBfWLs6D}Wx~8JJmGW+=1cOf!)tz}mb!bExRxv)p+v#f)jR_i%v~Satc0yr|EE-F* zn`(7ZvYW^V^-KaLha>~u)PrDxDbUP*t_JIk2~hTPZ%Ri9V3(V+_e2}8j~;vDCrwFfc{*a`5IuET_@T8S_4e&O&Di4 ztumk>OSsO6ZUF;zQ&a{wF`26*opqbWYYYsaXK)zGdennxh)J@ciZ}udt2)oDO7&X8 zfj+R7-lV`j(Ql$MWG#LpZ}ddo=7|E&^o@XL`i61(O;W|#p<(Na$)Q!Kow?B@dnCyo zbLI9}Y{+A-z(VvP*x9p<4nyik!0{0z5W7;samc#tPCDCN9q2Ppcx(j}?o2i$L*VjkVc&Tn(>K?>?}w*O-fiav0w0C8}mbsXtoZu-cxo8lJN7Q41fH;F($T zX0;JCKuNV3kD~$ByKd-85yw`(G`tc9geVy=8V~7deI?_%dVgeOB?=xE=5G}p)=oWIXrY%8j7GBC zqZr)>A`eK6jR+cv4#2`A<0F#E7f=i#TT*di5gVC^(z0%BHlbXq1Qb%{biH_`ib6^GBh_ZZ* zCNMg_q8`s);e}rb8_bH&i{B)Bqs~ajJSDxLT8{)=k2JpOO6!H%RrHmxJ<^D6KC)(b zI7!pw$cW&+1n4AP#Bdog#O@ujQF(Hx*|}F7n%yeJqwFhDJUlx`8?t=Tv_9h9glB97 zduc=tF(a3&)9=y@x%y~;)l*wJ1v44k)gX|)!%L%1+a`xZm(D(hE_4cFll?wu5dx+~ z04+5@G`upP5vV>Um3ARST7}t#74*dFYQ0GVNcf#;63UF@+m$X7Ghx#IdIVb32aAC+$(Ena0k!W?{n~Fy%@GB<3t;wq-psrNLR*U!I(LF>3NE{wt_|zPi z6XIH9CVZ7kCRXVZA4@PH+V!AX~sZ5&V zcT%=vtx;Ps0L!S)KQM;>03!mBAJW+DkA&t<*M|oc(HN21ojc8+2DR*yB>UGSeGzO3 zQ}bLy1ExZU8Y9il5}cW2pN=RpHcmcjf`xr4%SB)9qRQkl}}Gh`j`aL z#!ZX@by$c80-(pJKgM{BR)(;F-mL3iUDBAo29x95Zw=+X<<`)3nn0Szzx%NY%sW5z zKTJzBuN($#tI^g ztsY*H%$=X8;p@3LlBDkiXst1W)*1`a&>ACM3~vEBx&SGanzX;3BcKTm*}4^P5VdZ_ zyKZ=-0dZO~_&|*5ZynWRmNKHym>wTs8cm8E5uqZJO1ThXfCMw+hDPMPM|O~l(9p(; z;lYX8h>7Fe*}6<}ft7U5om&lgvv*KCP==0p4Ss|sPolbN=sGDfpn&d>6yi{0CHmV? zXsl)GhgecX4~aOkA3QAS3F}iL#zcesZA4BB&6(0?G(&UQmiMu&zJLf{n410|cG}#< zWEh$N3OdbQ6yH#11yse;h@M5)5YTaj8LV%XP+sH@5DbNS(XgllDU6kQmO+-S7_Ozy zTU%KB5d9}G;F7tI=m%>%x`EXxAk-S}^D81&sYM~RC#^AR-e)h_U>+YF*1+k>Ia1C! z(xsET`30;)UDkOQQF~JVbco#PHzuvGGbd>>4-`MT??EvplQ+t-h8_4*jWVsRc3o+cZyjoOAKtJ_3C?#fDFmP zaDFskm}z3gt3{4mcpS$sFoB|Z%SQfyO$|X_vyCG*1KMb26okq)sv^rT5thxNlxHCz=z8tmf z^2z1V1#*z8YJwdKShwFFSgU=>`u~2fEx0}AbGL_wthV4Tna|xN9i7JsnF6 zSy~#>^z<}^Y(-hU4cTSicYY3*>fU)xw-|jwz;hTN`6+zH#vG+NuU9%>Vm$%bfg|N* z(cYK?%0P^so@OC~bzex+Q=EaUV@MhRMMcdtza9w#wVoE;FtwRkL zK$MWh9x^f?jS_s=$b1z4kJ&8q$L#%BWWH9WLfPIZ4|_GdHRoRp#m$=J)goVxFb^7x zmo4&nr$ob|p0}u1E&S@&m{-o9g!$*HNbvg*cb|qT2ElqwA}#-h(j*@|r1+G?E4`pt z<;SL%LFTxhGQg*-lG7GGt=0FDi2O#g6|#*QlbiFeTaMRpu`)Lz3d6}0-m-+Z%tw28 z!W;Z6i~CiCbkZT6RI`%oBATsHhJYo0ZKk(tR;V%9f>TaL0hH=KtxH#OVH z8~2eF{>T7*9BQ6FYmpxtuCJ1mWG`FTe+|urLFHK(G*91!#+b&bJ6(M-%eE>&Ajw{} zfk=Ve>0hM3N)}63V6-v-2#qt%&Mz?LWq33@uUN%r>{nWOEo*T>~Q7>Qs zU>Y+t%X_#mO|{I$n8eFu`I*K%={iE159(nlhPyG^MeE~>ctutZ$${B=j$yVszM3h# z5T+sOoEBSe2AH%HNILJRVCy**Y(3W`H$BadNG?0nE0ilyI9QV{D|XEa2vx67$VI|L zzg}OX7{mCI*Og?K-15yX1;Vrj#U&Zj<@a4V$u6PdS8!7hnI$dkd%1s_M82__b$Sc) zV;+BS>EW*4!v#@G{*xHoTHq0RJ(Uosb8l z+4-GPIv3=59mjDCzxyn2W8nOj>sB5{R~dCJwPWK5CV$fUpw2(@IJZ7fPc7`u%bE6D zxGP%Me@t4RU>tW_*NQQ?e`Fq;EZi@MCN*{3o=qABI`X(grK1iiyn=J<73NQI0m|~& z5WC>yPAy|<@kcCtM2?KsOtZC}NCL_53c{#B7<)T^>QZ?m8#T;Em1u2;SLqzQo?2aO zzlq0{_@s4L@LIHX%20?Kt4d3%yWsi3G$Pi9iJK1~? z;kx(JH*cAc?hHZ!9#Q_x2gb^;M6iU1FVr$S1e$UCWf{ja1zKb4iCogD%uD)1P88;X8J7V8v`WqgybY%8HMq-p;`yv!D;SQNRGuscT%~!*f zYT=63F<=~f(_sH&Sqv!8WZ|e+U{B%K9-{3gEhAl9608AWvhWlItRakG-YnaQVew!X zBf}UMa>zRIVBiIj1B>9tF`AlxtSEXxXj)jxec?Fhn4KF!7<#g#*#o*_LOZswawEQB z_7F1K3jV?|E8d_}Lr|>Q#`gpfIv*k}O}NwpYFq~#Ff)+0F_O?h?Ui6?UCLBI-KXAN zQ_VLdiD~j3M0#gcf>UgL8@|*Z_y^MyN3@==1oi@bG;^O}TxOF){MhtwVKMJQ4>9d*r8dzENu%lw2V;BGVo<&Ij1?Xp zuQ6!^^hkge`-BJ_SrQRz@d{b(bfK}%$v{j!ZPp-iIUN;c(qX+aia#45&hUt0VVWr^bdT#q*vbl=G38N_?cqf{zp{&3fF4pu`e0DK#>a!dOj_fAmVRoS*cb z^HY2=e$tCN;~AbdC(}xu{0w(0R;ku*B|F-0S%Kz)o|dFMj-R4D)9WFVo}Q+Vs}if~ z`r(!8_s|J+ld4sp*2gN+NbyzM-rtl0#`2y>*o$iY?&(^;u_5=H!9GeqwG9HFLItg= zek#&^Q{zPXDFMgK_tZBR^mNP=!tG8)_>?Cm!!CVnFWap@F=6YLN?N%hCaR~j2h2DU z4P$xiDNiGB>yME@6cL+-N3%jln{{khklR}#l)fT&bE{*mAt46wT6YwW8P`Ed!Ic2J^wen2 zMyy+eN*DdfVASnguc;akZErS;r+88MrC460lVx!^m83W_r;1uU2lOk!?5CG#)lBflwM z3>t(-!pq37(Kuv{qic~V#uRzf4-VKT4KXhpkBdo!?JIIkdnRbd=7NWE(H9c#TMH@B zY2mEpUh8@#)Z-6rD)sa=RoWUNLzb`^-0`wFJebU3yCTd0JuB)i#K~~$tef`lidgSL z6ip=3B?&!CC{9D632LqPq>$a!qbR17EMLi?NEdM|`aY{5fj zoO;kl8xLzi5hFvZb@g%W2%von7aak6LN)I!$ZhH~?>e+_;ICkjmfvM`86*55JU`-T zwgG1gq(66>ep9N~8S*XY$!2F$E9}kJa#XQRU#{2*Rl#0mzC>oP zRiRj`K)4_&Wc~87@&0A|-N6hWcYbSTLd%g7T+P39#>jjW;UVpr$Dy<=&7f+wRUNGi zvPrS?De7mu&Ss3Ua>UsBI4!es>fX@rcp&8GGajJtIVhmSLC%tB7L~L&1(|Mds>_Te zYfxSYI!;k*%jG&w0yBlhqJEEBJ-l;X4*86Z@=YmZg-X{Pm%|)Ay z^Q*9?+zk3j`v5R_l|Q9@F#1#42fxI+1xtN$`N)f*2|7LrURV>iZjiZi>W_A~?*}rkb4ua3E`0?Xg;#?T3elhgrg5&d9o=T*y>MNImKy5K#zc zs+Lpgq_G05nAMQgTr`GM@EF+!EsMo~$4kX*9ns8gSEt@f~4DA^+0d~T)vj*Sej06|px4(s9e^Yk!YQ{36+QAnQ(J)S;gE;b&) zW03u_aCv9HL?X1<{B^e#EC>S3$W`73s8l6)}$`jdK%ok*MSGP}D?39H!S$Gq)kpH9ou2ptqxr4ZUX?a|hE{|)=dyup* zhURBSY9Z8~HP&CW4PX2Ukz)bREHx~SS>!Voe#XMDh7606i00y}7J1yl$F*a=HGIbV@B<;t1+ZpJk7kur{k;Qe1_o%`q)7vG)bJqvZ z>4h8E@L_p^KitBaev-90H%V5irEqQ*3bw7=F1~08*}BK#Q4722zqp9}B3Sk`v&uqK z>{?osRh7|~XZ(qqlnqgJ{w3}A;$r1V(wJ6tj(+({$E_>_+u^mCd6JBQ9XdzN0s>&H zB?Qt7enL@T(+iP#+)>>=(~uEjGyDD0c4zo&Xl%F5u=bjlsB7W2ea4maneSzv z3orG&bSGzNDOoSw$?e0XZ!1cXD&sav7B9nvvgTukLt?hwRTr= zSR-Y^z72M{jT!&F#Ss#eJPPtTIdZM@-_l5B80S_t(?vMk9QSycO)aG_u*FC<${k~@ z#lZyWtL$05WzUXanaf$kvbL170`l|oD^?d;(I#ZYl>d`l=xWdE43ZTBNwYeCVg*qFpj*q>Lk3t=K zs*Y)|L$97e=SU+|O$F?Avz?i>F-%0u%pl4xDcreV>l*3Fq($Y5Nm_%Yv8@iP~C}L1&lEU4>oUN<<_#V+Z6D zHg%Ql2Iy?ftG+MPabMDj!H1L1!+H9{){^a$I@yD`Py>GvN_?s|c8xl1EYnb>igm2A zOJYra1yTDCmIgIKx1ZDqfC^O(=>UFN@Jrf1wra@bFhhV7;KMoZ_IFWT(E8slV&PP*-Z29(q9(tUYp>)Fnt zEq={yiE_wr_O!{N0#J}&Us-8CjW9Jki~NavBCZMpzx{M5+w41BBt1yn(6PguIy6KulvlCL6J?Ms&B0qaG~3Nz$d52*H~!xlMf;aLmYn#|G> z3#S&JZW`8JrS0$~3WjC6;5DR8FvY+?~j-TMaHXjPkAkxpp zj0zAD{rDVGWY+0k1o?ubab=;?4B36KL&yscyi9D#;Q$B@{89O`Ou4T>t|htnqp!eT z0wnVllp}()clnxxG%W;l$mkZc$j2* zA^MAM9r(E`Z}CqxkfrZyBE*qKQ6e}&h*Sj*b;{0On}3?=KGgChBMY~nVby2jTK)ll zc_g|JF}hs_WtP&7h;xuHIvO(R>2-LF&ZN^caPB!QE-Fa!z4)A?!2LC;og#_L{wWDnYI8 zct&mR*Ssu!LHf~en<}K)p#&eXO$vch2`W|9d^Y-{stgB zdo>dvYcXE6et_y~$N_K2e89AOE@JjU#LNQ1?1KWc54bJl1~wglOr!4lG(c99tvx{2 zIMbZF4b`tKa}WBl0xiQx!_VDbzc8uCu8)uBDhxY!*Zd z8K)Tq)>y^qZ*gV0qBnp6zC|(~(6S3qj)Uk@3wFJY7M;wwY2u4_g;^vnNfrz>7_F&6 zTpI!MG8)fg4S6K|V&zpz_2~H<2ke2o6zJup=v-4DLgjCVN9$__oW5&{8U)Q(g7P*v zXk{TyQv~Kb9GmwRt-IJM92`Za<4>rI~Kr0*u=dGglNB5}Y$aRA%zlkDl{+&ADa=G0FI^Co-R zx5+#m*6T=N2NScjr|G&kI4?9YF*y;(Zi93^UN$IHnQ&A^Qc*V4HA`^JlqVE3y%}Xn z#Gh00dVFB9Ct~Tm{9!V5l~BY4B@!-OU^!RhA!wB<%3FAZOx?_^n5{5#lAhO@avH-v zr(CjSK*clN+KC)>0pMcgt`M4Y>2QS&*!;Hv606+?#vW>R7oj^u#PZf$MdZZO%Z&g@ zS|_#0WN<>@9qq`$>Ix=SaK~?R4b$q#I?i9N8`qEyb@88CGwem12`myg_&#ZoAS(15 z3(4IP!(7V|waem{=}lT~Y5tTRx{#xS=M%TE{#es6xTHp{d!f)p7n*ZVu`GwUD`U`I zPkm!}%sP&xMf(fYd>Q}|yR7DrrQE{}`~|LSO`k+v`)S0-0%D6#3w%Cp&K)h@!0spu zBRULIM4~>A$^uTG$@gn=h>iN~NC~ybd(gV=uTdvSwiZu&`x39Vk&(*U;wNa;zJ$&0 zNVjhDD4mBe8d-86R{K(3GevYF!d$qwh1RqP7(5S9LF=}>K1!xh$QvUk&G>|sEkYX%ie$D4TBpanDp{bRw;Yd6=;N+; z&T7Ppr@Lz8O^g&^T3Qa%-g21JJus(%*%P&?IX~VLMXvEp^b=<|15@Y_uwgDWgD7en zEV5~bWegWqz!YPT-&7ki9hI@soL_5;{1WsbLGb}`lA|#W2&E80WMxIY+R#KbS$al> z&Py&aIx`<#ixavA%#zSrbKlgWP5M6P(7tG^{KSN89mvngqW?Pbe zNDgAMueOnN#Xg={+ex;h-crR=#RGpGO3>*HY#kj$?q;TN{*I=`7B!KlyUG3q@7 zF>ci7NnZ2mP_v$fo}f4io|MdQwJgc}Hl@f1xb&9A_|pnmlC{Z`l6f<~q2rEx#x*}< zLDYH-L1$A*cSqfHx5jc~jb#2V>bTj4C<^Gsm?Iyj?9CO0DGa2Q{+qv#jO7u_BI-=u zTl+Z2qjmp%x$XFAF~Xv6ET>6zcKe^3YGQ%$lB>lo^=LJVRo^i$Y_5LLg7f#g7WDO_ z_PaEY&f)BXWp-Pr7A2xa_T9rxG}JEW0KHIeceBegyZuU)mYVC$Z{2N>DVMbFg#vc4 zo5cd1<&hGERa^UAQ!U9J3cV32fH+WIyk*s|2?A)<2M8(*_@LbHmc`yuFELKMYcKor zQc~KXR2&27ShbuY3TOr8Yx|Wk(eeA84o$nRbd1oE4p&b{2+$DHp~~wzzvj{xVDF@ z$*D5xT$W3*n`DKHt0GzFd$`@6uzz?jD#}|HfTw`b zu<~pWoX*-HI36%iQE)nI^NthTd6iw>KE-~;8P7++U#^JRY+#J*YOO<7&)YYelDIF)4l}@e2iQ}?!z(%W z2MVXJ1PXfq3UjAjR7hl>mpfa9=8rlVAC6XJG$48Q0yXnc`pyFY%{Jvg$v%HQ;I_pK1H*G>^-=Y zDt?*Wl;j-w51N(H?j(DV^Tke~aw(?=;wNu;OztM#geHw8(65TUvj<~yUuC^r+q&%7 zvqSh&Tm!Ouw!%J5ohq+y;8F_pQmo4ds`xgdS^^dv4TJR^UU#k<4Y>-sUo2qsGC?9U zth;fV$Ik7cf!s>KMj0cGv%gxsdWt1S%oO81n9xT+1|apJJ$_TIN7B@r^RK(0(NPaV zd;^Am*K+gBc@I@U1M2lJOtDoB@TB2@(I~Cy=xfdv7EnDQ@EZjpTM%r{pN?H{daZG2 zihNH5hn~1ANa4_vZYi|7Ca`xJwrZ_n?Fl3$BW~eX$DVVlZx2F9Ar`p@Jlo*}_FOf3`Uv_g>DQja$*kp}j#o0xpKW{2j-|+w+{yJs!QP$HRtB zrNuVpX$B@c-n}V_E+k5N%5Uh?Yc4*J*u}>KBGLS1@88#rsK~z2R5~DzW|4l1Tj0tc z(*g^FU$yJxoFU9^;b5(sq)OQW9!f`6XKOHLR4C=_gwLa zJ$=8D#g|@?n~>sS#TK;~5&EU|hHtKaLmj4BoCWY=SwO7SVe?0*Mgh3IGZ=|Xu(`0c zOd!%McdRDJYs4bTYj~&dKS($9G|}1%2Hu=<;~jQ6hK8}Wrw;0h?UQjiwCf@|<)WOv z{rh2UR$ZTDw~i#O-LTr0yS&9pOLV})3crxcfuB$eb$PA3;+$kQ&f-f0hTNisDTTezP1VW_|%990@CxLKMx88k z`9rz&lh(F6*4l@m8G5Q2tQuZmbk|CO9{bp#7Eu2%R%!tlq4i-=>4(jQ179Y*VU*6o#%lrQ;9qL4)Djq;5CsHK`iy6LfB!5#S#hcO!Ye8u#Ye(#!UZ-37+Sey-w#3}9 zuGzkkcL=O_b#v!gZD4KRtZ?>pai(z$>f4#dG3;2KWh6s$&NfsDhBo#YEO|lOH*sW$ zvrz4yO=83OIvx%l>w(-ZpnK8&c3RKZ8Cj*QMm42eAqlN7?-0UWI!0=TGnUQ;A6+wq z?xq;eIAaN$p;cW7IyxUt0sh)@^<3`COXTIBc{n0XIV?6C>v1=C&?MAKc+%{ zJT9+3xL}l&aP-awB?x_r_pib1WLJ{^-;GBOqN}>+$?Zmq>O%RInx!-u-zA{e0`f(Q z`IsOyaugLUHxpLw#Kbyubyw4LnZkuUue@68z2*}H)z6N8SFYDd;zKF*p%nk-TpGfGNp&iV9XUXjZ`4Y3jVG$q4rtjasD&sq zqNEB!Ydf@M7ld*P5mMcH5j~*|TGg*O75$9U8ulugtOz4yrD{~qC04EVjOJU6$FKAR zyL@^f2bsUv*(Nii*c078khC=smySJP@D-KY_U!{f=X=0%<%+L;K*wNgMGr{OFA>0l zIm-q`yJ)*d8FsQ?|E=cW+7o|DM|ghC7{O(b433UKuky`)?FePR1|hE}`*mJBigs}v zc9e~h{W_rO0njXEq@Klbv2N1-gI0C2TXPI`XNIn5cg9D%?t|AfZjvW=y)3S`NoD&Z z3dbERqL7=G91uZor>}UPkNfA@giXu#Os2NU(s?dkp$C`FuS=F}$8-8VZL^@c%)t&9JKL$)d)6k!f)o4fUv5Wrjdoji`@ehLxtWmI;v6YT< zbWe#bqH9WQF}q}zbQq&A(HZeBD7}D7c|O^HJ*ZrSdY4Z_?NT&==M0W1v-p%YsH)P% zt*}H8lUH0~WTw25vvOXHxW(v~Ts#_)UUopE2Wd`Bm>)!L605H#piF8jSoqgcD2ttDSJtpwBPHJ5c0~Zox8Ds1Z7`L zpC0}~S@Mgv?gVH<%QEJ1N?ciCUmQz~t1{#2RLi}{Q!M;|Ovt-s7O zt1Wn)N*4tnMcfuM$nkza&|yex~`^KHSVaktm8igJ|es0Uxo@I<}Z za)!T#x{4-&3J_ykxI7(HnY!o4k8-!q;?^%kw~yuS-Wz3z#o2kFmgeIHW%O1MEt(X0 z#fvYa+vPKeg(Ha;=|9rSM8vw#1u)(x>_nBCjWJlg;key}qSH|i>hzgw>GT-@qwp8? zv~etdmhhK?$eXsUkHRS9EA7$S>96*7x(!_%lv|vMoj&88KI5G})7|MaGYZI zPM?XLo;S%lJ%1~@Scg`m*sRI1-Cf;CTA2(z-H0B1wW}MubtGw}ZroPx#%)Ds?eNap zc`co_6C~AHdaAQ_%}>t_bgrLrjF8(f1Wyaf@$pa|Zf2EK3(2monvLlf0d4O1+)A zNvGz&nhPu%c~79a8yt+n{8gOmh8cv>5Qufm@}j=*mXP%F z42_Nb%50I@E_9++jzf|u64!|mVwL)bzNw1+s%9vi=@K0!E=gyj)xtBt|A@SGav@rs zjT)pGxjkUH^Bn*ia|>1=7FFzaEuMC!4Hl#q_=2id@r1?ZK~txk5a?rNLhg^_B--=q zAZeHreJs3K|LAPCX;J4emR)J;#I%dyfiHM?b`B+K3*R637zyYd(X6obSmD!OVm5R^ zcQNS>h*+fl=VllmVLO4LoNqDAQH6h)1zBN@#cC}M_odNc);Zhzaj=KVM>iUzlu61j znKoVlS{cOpSaiLuX?N13?MV1jmfs;z&X26ySx5Dk0@hz1fc))4IRm#3aSD>Vk03!x ztL$dq(w5{{=hV$+fXPPxjX4Ii!K|h4$DQr_P zFx@kxm~lGCl$rO^^cN9(wi>8fZ&WzjL7hW?-ifi`wkccJmB+x-y4wqsm~(r%mD?NCN3X}lp_plg$)X*xT**#Pd1Kb-rheAH zbr4p+I+FS^x}0BR&3xt$Y%wKus-7$zoWzxjNvh`Y?6y+11DNY@PlA&VM4YnS%Rr<@ zPC^PT%?h#>(oQO1#r|q|HQj$IX+0nzXtNvf0pZS#1?g|Yk~~q=3y-xPpa%ZjG17`V zHkOz{m~tQ{X7p~NL|#8|mk!$!J+&?0j-FRaT3!ZbTsjgdc;s6-s;~=xAnAM~rNSmZ zp{RrlP9=LPD!g~KqNoDSD&~@^uy_;7>5cSfI7eo1ZL|yX`w*rIIpuzWU(9wZF-RhN z`HK)My)Y7cwzy-=-*N>WUj4w@I`a|Qd9spk8HR&ij5klgO73_MSq#P8`v785VJdFv zDA~X45NE`M#EG8@jZA@DhbwkTPU28Osl*j4I8JuCmQL{0&}IP*@@yoSAkONOX7oL( z@hnXHT?qs3m3M<7MMT)!Sc`iLDP_B$wX9l(<|BcD^q_jf_eJ`9JjWC>hTYN0lHAsY zqyhoSspUwP5s+^>Adu&baMjBie6`hcS)I68D|}{vJqa5v6N}C+R*=6xV~Y7+4{oQ{ z9<6UA*js837n)#=K>N#XX;vw5i7S?`k z*pn7GRg~pl*+SU-Q)K8P!ZgRqTC*%mNhKh!g*hmo zZ`*3y{Bg%h*o0yB>g<>>ycDE=y(}25Bgx(Dhka}UAowys}&OxPyF>yzwyy?|NG1j zD|;%BRQ6RKsvN2usLWPwv9~8G4-?u$+$^CVRUWVGC-h|Hd*siMG z2LZ@GEC*6x@_jPyH5wlTqwhoMh=YR@9)DR86-2Cltt((X1f)mltvz{r_RyYLVjdyx zQEQ=4Re!4&|NYevyE3qcV2(q8`=4-2u{6;{#hO++rLyc zFHgLZbSi$f^4Hg1Kp0D%3XM(6iwRF@r2WP~x9}_YeH!#HWRaTQYd!ogSJw=^^?a|3 z9%8!K6VAc^?((VQMX4B2ov zJ~6xRkz4NB_t2ro_s>3g%U$~(e`Nm?PwfBEqfg|KMcnPPvybop{-N1@(^HS`n|)$- z&!cOby#Tt#mC%UibGviX+H(^GdGIxu_a@qM>Fy6@2J<9iNFPu+Fs`v>+v z^sRkQ?*7p~?R)gLhaUQy?{E35AN=5joE5Jc`Z=zj zXNXH*)Q{$o2{%0x$EQ@|WHmie(}x;3cEJ&p6FR<|zNIv~-E8i(Abz4BUHHuha!AqI zgg)G-*g?gf)6b>Y)JwvNiDQypB)+xMfZ0vcW6C1@N3>}vJ)vT+=E-xG{Z=Bgy3W_? zAV~b2Ad#JlQpWkPZzF<>`_42U{9%3MXI1OlOZLJQyg;8YV3#P>Ij*A9 zFyAcy4(jC<;iStunPdvPxvBwsO}XpV_?MVF|5{n!$-BF?F}9?o9!#^G?BOFf%DxpM zwzeAxn%uf8R^%b|Bez_51GKfL)iLmXzj|KkR5^#!)N-5>@H2TfqgVQVE)1=`YDHUY z*Pe>G+G4M4i{f@uy!~+K{kCCvG8mkZfjra z6PcxbBHM>+D|DzoeTAP^ruO+llj2?w2gq#%ww=xTQ6F};>1R6`Iy3s&p`V?BsAS1Q zDv@0#wI#Z9hogYowS2pZU@7)ta-~M+LxkE-S|-1jQSVt!8P^N5A)RFdeIC36VUslF zr}I=m0VP^gWRfdtc8x=RAh`q)U zg;v&;{CeIjeUMu*Fmy8atJv`LVlC#dFBmKFOp$0X-wo8@!@s1y*NlWZ;cC>u{y|^9 zahiwk-1bI{^hVT#x-ClFMhzmf4`*vt&Br9V%kDM{LE4r=Mwr%Z5o!A_EcxdLBhq}n zHDZ`;%DFxq$ax{Fwf+z+*=Dl zom34UuA+^2P5p?a>Qi^b)0d$S@fvypdDWfSY#1!+8@daa?8MUeQ)7AWv`h@E;(PU@ zJLl(*8=Zb%ZN!$PC-MdyjB%Ni^ZbdC6*w^+&xD}FG=FCe210kogf7r9rY>MnRnzIP8@(pw3K| zU+%OIYl!m2S+F9VWinySt)`&$65dhCzS|g5KAeTjNp&i3nTO!qd4?a(%|!++HS9el zXjpZw94|(a8mBrQ@%J)X33x~+O zy=5qG8hG28^0Y6CB?f+ByUMQD&u=4uQb-cFutPsK#Hla%P@vxLi*&Qk@G0g&L(~o+ z1)i71Ce&4+was4k1wqiF!-rNOq-uSr41W}mz50=eyFydKLavqhaE;#I&Z&0F-ak_0 zr5MS_CnDVT0aDtB?Uf4sRdI`X_wqFYRVL+=$p~B=0-t*&eDQ)a2T z#f^IXSmeMM@J-wT={vWTc9Ea#h(fdcEasHtivT&&vw4s$)p0}!n<8iGS{BLo-))P9 z*!$Fzb7yzX9eK{}y*amc=iD0QJ3DDThQ!6Px>la*)%9E<-z~*{>%3B<%(|sU=JI5r zeMy{~=W)ZWCl6bTLoLNVz^+p5!@+#%f_ykHwbNNv50;4Az^WAEMX@0;@+4Lcuo~bc-XWSO0=cu7scN; zhSsJ?2eV1jNQ$;>H8~VMg*(F`Ee*g=`^m-hr?z({{b^q4XZaUe(w_}XaUB?2 zuGnk;9QV*CTN`WjYaJ1)+uRlL z2@xZenl8>GZF+Uctap;8b!7)P32`Hk0_XWFN}snP-4T>IpHv|2F8e-IpwnH~RR#lj zyW=@8o#MbVUk4De_XD^W!3?M=GZxZy7fpS0PwG4zM~WU}4Szsxr2n zyU1+q&Msq48yIw%gyCtgy@j@oS5a$L-4*Mw(nj}EZMSz9yh?50XP;5)g-}P7T9>(} zc0Fv}4rgNR>rqhyd?_ZFix{t1Y$|w2Y}!^1$|r4Y0ypyNYg^$}G-R8J-uRC)dhnkW zRdiC}>#~^mrT^BB*8s|%@gN{pZk6yDCs(X@Ew8$py}j0oa@;j(uU8f?&XtX^xN5cH z>m38t-P%E{J|o}SL2-fM*mp=bs1pWN3a35AML-qRVQG3cKkd4OQj@M9x ze5_5PofF7tF75~%K&9dn-CmTlLDh=}VN}sPSxmzyQACJs6cKyoZ@l;QQ6;J0g1`E) zTd5pe!%iO)+-oU^6=_^kg7B?zeWdPBfY1k4cPkJ(^5i7z6`B$b-L3e{a(!yPv&?q2CVNs+fhCEOr+FsNWtUk+og%rwcC^6~G z@`f!>?rN7*Uh8C#z>eJ$Z8wrz{PQ9Hl*K=ffBDo`#|QitmkrUtaFr2t8lSMPO^*-4 zM(WRKY~*>QUF6ETc~DAqLv6zV4HIkIXKB+9%U!}JL`003QcmK0pT^cashrjY@RM>% z7r;-t$HOu}lFG%_moT*RYEe~(J~1p90RypQU{h0$pT@>g(rUi*owQyDdpFhm{WR}x z?D_j!yt^H#k7OpTU-2$$rFhd2Y{Tv5q&@A0-p)rWe?Qv;RPPQnPYs)N|Sp#*Rm}$TCFCPixz?VmeVPGRZ^0J}oT_t_O z7VnZI>_wR&)tzw!+eTn!Tcq`rhOupCDP3cs9m&p-5N>GV z6Qc3^ST;^}vL!c9IXFTRMN1HO6%cooA?~^&L@th92630Vg6~H%Uz>> z;Pz>V&6k_$3LJVS%=%!C#u&>&V*R?vb2bVN$t#Sy+RE+->Pb1RG~_~tm5w-5!o^fHGs1di|8 zOWCE*vX|ivg|ab)qz*G3K|~nSH<(YB-pI`S)~B4x>#4-X?1{cv;3eY|B!{?TL-nyk z<5|cD^ZMbYXU8g@lypX!4Z~u(^PK^jj}{QZNDax^A(E{>9?@5Blk5;*?S0Zhk115= zD_LwNI7A|SJk3|o){nxkowbCyB(+3ywT<-|KRSDW6M(EX6$QFQiVTL71N5qhp?OMJix{bgUV#ux z28#8fFIN~I0N^UZp2{nIpqC4LT5>Wdhrl&rPjb_CqYa*ho4z(R%8gTE%={Z5;RaO~ zPj=KRMUD-wrNgJT5?ZH#a;EgGEMBjz4qkAyDL ze>mCA_MoXs^00n(^V8hBS~>4a?oS?Ma}ZmDs4h8>JgojZNPIixD=&&rQFAM4C5l>L z%H8IGF+ABVMDvm(9L9QSr63*whlXl7qHAlLhn)$JsLI0zCVP`iz!t5K(muN;Z85&U zGwt_Cu-j~fIVO{d61`;H&+Wd}IjN|{Qr; zPgC_XYwd`IN&3rhAyXbUU#;tkwD~r%$rK#z5LEv-RW<0`^mzlSDDIZ!Rr|NRo^jQQ zMW#MCoST;4Iox9)jH=`hx#76rGk#664KwM|+9`DZ2`1^>q3G>*jutpkC`sSqLUPN( z4{01owd;g+ACRK$x^lp0pK#9~AE`HYr!|tE5P)oL-Lp;(8A0PnSvWo~S-zGoc1qGq zfKZddFz7gh97AiTh9#KYqB$lWMI?;|7bE4_l*TpB(kd5T$Cmv zc`IIx975bl3)8U*H`I&t(8t~b_GNp$P7b+Jxe>a<3@65or1bvBu~S<&8up=gsqSMF zwAQU`t+N_FO>AeKNZU>gjdrRoLy(9$%|5$PK64w`a&m~<`+3n9MW{}PHN!jmA}pRK zu@J>FxSn9sPQyD>`*-B-q47z!$-m3E(J9ETfe?@RV5FoM#TVJMk(~U(F`Lf&FWVG@ zfP?B}-RzHPTF=|YP^NRz+SNH}jlArQyc`QB?TdV~!v_??d31K9h|bV+A_79xo-Lx= zvrbHX48ovh+w$uw?N$)w$yk)O3$6F!9lc6$mY0NtY%)x3MSJ4wr_ zYB3`kdpRY>byKFFigUPuRBX(ZW>|RPd15VcVbw`lXM2!yp)B7PgasTWna8of4{{N9piAp_SU^P9Ji(Yn8 z!Jzl85jJ`!ZK0H8J{)Byq%{J}XOirBD~_cPN-%*Cb5T8(vwp_C+(O=|c#IF0k&8bN ziZ*DXyP1KeY^$IPJ31vq28t%QCVO?*#)9lsp`$MX!zKQJUiOxLC~cg*3~&oj%gbWF zQDZ-TX~x@*9uLNs>`Z`p#$V5d*R%e5F1((Ly7T-B;{-jZ=lm)eE$U4GnE|6Pvp0*C zE|&ebYSk(h7FRWG=wz7J33rW8O9+^DFJkgQ2@NmQR$~tEkq`I;xDfYFSvSD{$dG?; zbV>sQP{cNBqnRs1=;KD+v~uewjHtYiU>1oMpD-T4bK{M1(pNxIVL*xoJg+Z(k@3z9 zXn+BqLKlr!JG^2d`_#rTLbpw%k+Nz0!`YF0tTU(@!&Vkj@OX3ftkc+i6U zlI0aMteBCHDrLsvUNcDb)f&%`3Vt3yEC;U(pRF=+rqiEOWYT(bqF+3P=0^DrS(1rCIQVhd10#Bu!(2=OH(T$ zngQ?n6)3S%>jNf47C=9LkgJ8(#$3c(8=WZO@gWtte$qthI#bjrE4|=KiJAn?C^98- zq$KozPo`12&!UuWsx!^x>6ilChe_*?aqQ8Kb;rzRqXmW1SB&r#??QjHw&wbhYo39U z4^O(T`7{xzn+;)n;ofB|A=Au(L=sc6w`RC9DSWOQzg!DmG>bVcpx5V@Xy_muHCeWo%;IF^c^o2wL~$ zA%|m#x#Tf&I$BF&E2!01<##s>pWP830y8VsW{|~!D^q|n>jre~ubUC;6x!uRLu*D_j-^rqz86qTE3^{;mR9p0raDb%S`SBr)RV1;MRcR#!%oB97JWd` zUeB!Ed`mt4dL+Kmhb*U$*aysQRc^ggM5MseyAm9s{~8=_rvL1^W_qdFI+_Gg=RCe= zSyPExA&>HQS4OR=Cpc1{w2tR`biyG%Lp0{T%IIPM7Xeckoq}aLsHR#2CD*Z5b{eCg zS<^bN*1a5kGXRHZ2@Y6(YoSrc@(kv`Q^7>{N&h&HH@9=C-cv=rr((Tk475%a^~zN( zUJ0}oqLv9um~^ZbC%*J7Ux|o!Wf>S z6`gZM)Lo#7JaaR($LcBuVx7Rce(HL0rtu@FbS=b7h}#voPr{1miOi@6=CZtw8`rg! z!(hp7#?Uiwmf9p$%YWljW5{~xKXD)H^JFlQFg>8b&azk{T^SPmJQZPW(A-BxvZX_NLQ^tFw) z29$TzpZ7p}lX`$mM(y^rNS|%77ySFYw0C>TZaH|F7P+6dF^nIOodDZ-@{1Qo&$}qf zat1@eep;?6R9HZ;cbuV#J`6}2NipSatSlhIOV~Gos(dcZLb8kMR3+=iy@lmz;%&dKeut-C z_s3~}yk$+naYcu4u!{XCN$04w^=(ltU9_6hMX6|}i3$wRDdz%N&f#U_^(;iQ9yo7B z&#GwKWV?MHnV={e$1ddEmA+z`!`ytFH=skrqK*nWubwJf7hyc z%eq0+8jnb&N6}p!{CgP4F9un-$k|7!ic*ZHaEWyL@(pH8=XqmFC_77zVvdx$!H^p) zSt_qZ&Y4^x+&-P}n6o$b^!gY`*1`kQU1~>HDZR0M*Gq9#Z?sz2(X5pATRA$qfmjhf zb;Z}RxD}eh4P?}djZ z!6zupXvQ2lV&)WYc3|Mo7aYYaNa+PF8#swlNq6+ zp8o&ZySmsqj_W+DADf~qSz_GOO|0OiQ5>N%DDje#D4CW;lcFexlo*ndh$b$zymzI$ z*1dPHcK1@EA=JF$b&wP;;0HZ8K?>M_9~__oil8oB6b6d64-Jq9J@~;7Ezq~R4@Oa- zDO|v4`h911cJJRV$s~PfYYLh>J3HshnKNh3Idf)qmw9YxHJ>_2df;HNWu5-EY%s-_ zx)8fNhBN4~*p>c$T+vv4uvN5q_(g13+e|#zi02pu63;GTtS1MW(|E>F&a~pDa7q?l z%}L2m8}*6mC_vRGW!-I1M8C&(?C48s9zUSN+JGT$JU%I)8o}6;G}e3jakF0z*6lT` zRt_{4oUGeGxRXm*jQ^5eOD^rr^`cG3n0OX<_Pcrj;*h2`?UVLczjXp0zn1(JqHlvhN{Iw zo|x32fs?y|5Z*vD1g9A^6z#at&{qf;CwGW@<27T4>zJKJjX}Z~9*m-e_pyq-%}Zs} zH?XXK!Y~q7WPF?7K83IZBJFGZOx5^7MNNe(Q8W)x@;EIU++BDag8A{d#{D&z=5Z`t z;V+0@Zc7h{fa-E=kgcx^Ki0o03u!#lI?&Y7wFoFe5!t#XtvhNYL-q#vjS+c(o?ynj zq3r;+>*##ZcWpk9EUivchu)%}`!C5zJxJVK9OrL7pwD#QjxutwuTBU7Ve-BQu;Vss>Mh)V)KVSwTE71o;niFtnh25wsT!otd zvN0uiC7tM3z?yra*zuhvQRi<92jBjJX%IehRPQGP5kW0QRF}9dOMN)a#yy28_&Quy zVB|&-%*f82%txw4p6$goVk5WpPn`w>DtJ_!eOa^PfPKU7!419mg0ov+00GE(4nH^z zg3t}R*tZLAJ34SgkmGsRm_O!w=-N!+!{`Eyk7#Jy_wIn~z6^X9F&7FkU7N-tC!=nq zZsN!TcnhB%nK}fXMg&u#AHV(m2k(DhH_Jc*9yA3eOqb}%P3#+C-Xj*SuhDB!8w@(3 zJg)a88JxB!JX=6^P}2Ye+o!PDpaa5=_ZXV@&dQZ0;YafGT`ude2l1gWhihBZmO>0F zqjbRaCKl#MA(Ad+7;ibmur=N=nOU7dlgLnV;)i+RibSgyIQ)%wbtfnj62AuicVeeY zg3>||Hoe&zAF7lLu)eR!(3Cbl(pL{D6^~(c9?60Bj_-d!slWd-sUtBo%+kX|Bq2Ah z6!lktq%B#pqr$uTiVfg%Fj_L?2ZO9ta)TJ@_GoVyj`Vvb*O28&11AaSCu1k(W0HW^ zb41sTd%VU=I?VlAoC~F9D6Kc{$jQj6FFk*V*E>ig5J_orL#PwM+) zt@p=T?vKO+%_9o$pf*&`LyoX~)qo?s@lbGVJZv9L_^w)ia{2aY`#m_u@x8`6z%hi_ ze1$Mjr0_cbjfe4A!==Wvif9nUjeG5QHtr^PHtq@@d=VzbGu?(~l5cS*9u$X3C3way zjg8=&3BZGelc*Q^%^#yK%vPigsV-r-Y29HlW^{mj4TS%IXI;icp4Rk2A0?;--60AQ zb_GmMo)~)qx5U)6K1PQ6Q0Fv9NFy-$XtO*rM(QyP8-FYkYSX@mYx=IJTs*`jK@Pr$ z)ZTRjPaH6@nCxJ(6A7NtLUMcO5yc|BwdaW1&&=AMBQSOHtk!N^-am&Fi^)Eg(r;vj z>a?GC@sO6O{R1G_ga3W_ukZZ{(TxcBUrOaqB>gu@8knGPa`?B z8`oH7vJ@{zL0V$6hy;guBC_Oi;2z8FN|~I@AqW<=?7#y_-<0%6EXO$&rvE7ETm2Cp zSQRPw)D*z1JOUbEIarQ258-0JZb3GWc&~Ao_pmK*h{3jej8D3beRo2CW{M$7aTXiv z1`eC)%)+O~D?26kK5}eQc(U==g5{r>Vh@sBk5O8AdG{>+pNZQ_#PGDOO z7a|haZ)5q-b@@a6^P&Fv2t&A6Mng81h>#mgy4Tz+63|a|4etF&4eb4}99uJN;~7vr z5HhLB^?S@xmIm%?j`YPeWAlQ2)h>jfP)HHx-Q9=U=aPDJ0zSQ$wGkI*kU6>enJ%tL zvCiL>Jg^`dOwjcY9urV`rVAgFXCrUKy?RP>oG(SzISJwlWiWntS4f^jGMW^ywkaNC9&0heESV}$oGe&>o$1DFlILK- zb7vl|xnVn;@HqQG23Vp-Q4ii8kekWFGFY~gA@ClVzN5PW-z-Lg?+iyEPsz}0^Ug+L zn32L9Gk;I=HAzFJ_y#KBsO519Mc-$sK6x7UD;8eZwz%Vq*L=Hn$*Z2fTX1T8LE2); z_wEE1>dC{j>VljA;ZmIr?6WRqI?_n#*W4VvcJ7vcX9HoBOQiuNL$GKVD$9vzZK@Km0%N4w;elwis z2TEPH)VKKtxLGGCoyis5AbM+DG3PsWIdm&du7X>+q8-{RKq@E#w^A?5d*6sH0Oop- zyW#n{3!stMay8$3*(ro*U>`WcH_e?mHHcS>;tAqM^cB2%OYJiNgKS@^lPH>ZYF^-m zp1*d*FMq8RhPB|#v12#guvA|eEO?b;2Id%BnsHZ@!h_0q@)#+2J8h{6Q$w&0n(pcM z+6mc{UZGxbs^JT6wdhuFULQI-wy;($j0Z^07MGWYMwG%RJkuM|(Xk0ICv+}(MJEP9 z=O!)nd>RDNn^uD<->bAx6XO^?q11Uxo!bhMR2-+S4`mZS1JZ*qZglAQ$?L=0ggA8_ z3_5G6(`l5>JGbj-WX^H?g{oZ(N?uEY!zW4N8B3i=17E1G1O>dl(3x>pofo{~T0-pz zT7Jb+^@Vz^R$i007gBb{>tV^`YZ2$2z$>phz6h#a%{g~#c$=Xc=4?|V2LUUT26Kxg zH-P+BY7mJPw+z@EvJiEr>N-KLUIiAs;Lu(vJ2{z9!Jty7ER|2Adfu^%?6~VY#f0Ef zr`cP~_ZPC@CZqXfWTYF<=yBr7V)|S?>_n50F)DI_2{x2Q#*`BlN?oIsA37=XG8Jr` zW$-A$j(N5`(&ZaC$|@-d`S#rceU0{@ykOL?nG~NE@8p<9_Jg zunP%kP)5&LYP2_Jv_u{qo1rx}BA(Egr+}yPwGDd0E0;UOdT1nD9~gM((ux~)H-CcQ z8GV-Nbad=ubrr9HO{hM39jtoRQYW+f9L>Ya)v{Y{fre5Tu~clr+YPj#SU7ElGB0e} zF3>PLH)^TjY%1B(tX)maOJ0~dW~ozK1Dx>uq<48?>E^(fYfiOmJo2LN($%|R4uN|} zLtd=R=HTOZwAP%kAy9ritixhlzGbPI-u<3&ZrX*l`FgR2feoQ&7k#@5HR&6L>tWJI zV;&>LyuE0t$=(=^rHb$+s$;^dtxc5b)mw{Rj0t|xjHNF0#?(sD4fq?5zv>p8NC(Z@ zwVG3Gb0Hvumo4?;uZ%2eFD4G!?FCCc_bcFwQGiqFmM*h@m+!!0#CV3_g)UiYVSBWY zD=m-yVU}c2Jsf%PnX!or{Q^ z$gof@yCsT*q_aE%jSywaCfuWRC62XQ!Gj;U7E5L1pSE!}ose$$lnJb@LHY`$8&O0^ zhX7%wZ3oGWXBX#uXVvxUiSIUq(Mey%bW?J9CBU3@7QDJ&Xc^<|d4;v#gk2~(2|6qp zG3zOFF>~R!rJJhr)et^EsJ~&a1l>MFrkUFW7VW011j>Fao7y^$SBn!~1!g*?JfEpN z+fZo8Z`D1&UYWoO-^E(pNk(HBIw4)arn$auoxjxSDN_a}HQm5)sfTDs$*$gXjIC<- z0>RK<2OK<2Ur+RE-AG2vQ%w06Ep@)P?&*agS{Q&moofnA`gERVpz2y%WE!IkMDSYd zn+}$n9cvX#nvAIzg*~PrC1rGT7C9dvkbw^q&q+< z(2@O&<(GsFc4NWJe$fYxGD}tE`Ns!lBOHKDSew~OSix(k^or(loriYh; z%?Nga1!JBrg_~e$=Tjb1xOI+4d@=;hwK6IXt#`>%7q`VIgQ=TSj6H5TSv#e%qi>mh zODCHW8KBSN6x%zO>E3svDrnEAgB}ci#*EkDz|Jo9;0#=qt)od<_UN!j#)OS`s-|FF zwWkd8L&53D8(oIZW_KCKGr>$2BHPWdJS?k#;Lr;Q6 zB6Q!h)KqWX03#JC%q`hX=$Ukqdf-Y~lx0rFo@gR}V#f1oao>iZiqq9pf`(xXPM`4t z_qE$mKmaE!b#^o67!>lW-IIh2^d^10)5wUoMG`#FE$NHJZafQc&m{5{W1vAv-=Rz} zT*GD`*uki30-NP`cY@05L-zV(_)Hh16Fze6%;si{BvU1IB7yxXw$p&YOkccof-}H& z{w@@3Iq@(tl3Pc>_B#<^2-6Xu*Vs}q!8POLw#OU5#&mh?jlf`RXcqc1!*GEugJ;8cDY0sf<7V@9cQjh#PR%yM;lU^&r&g=Y{J z7yvKkPGecu)<-!Z(Q*JGCh|9qRcK8&43T)wI~6aC_W@gv zp0o!oFt!={6M9=N9hW&d5sNTYd%EY}Mq9Fe&ZI7Vn`jHzdeWCZEnOyi)2*8o194O5XxciGf84GL<04dl2Gsl*YJ#3O8_g5UJXU z&(!X|YM1N45w)y8Ph!YZtZcqjB2+|lqgv|?;4<)1%QUd-BEGr1iw;gwyB)NJWM*5@ z;PPopHE;3bDT_PyjhD;bomp&Lxrij9V9&)Wf{PI5BCE|jv88J4^=8=M8hqs@c9{xj zYmmn`2Ul=9XSpUH_LT#WU(LQfxQeg^;wicIYK3BTnH$4A0<&D;9{txgt1!5Vbq>r~ zR>g{4b#LIb;L{n%OdY`o19Z5fu0EBpj4v2h1E`T@eDFAQzOj``f)S45q4vr}<6LS~ z9h~U6o6<`if?cl37UOaar@XLd)6vVGbp+orOa0!3=s<1zL790E-*v_^&hv{n09Ua? zgfy~tI&fx$$Ai5p5A)~`Hg`eq!S{S9>*6$b@FF?yyUd~Q;6=w>q20`T)uIG&NEZ_# zntpO(H>!nV+%P%>@(p#f7eA8Wl#+~md5E`mnG)(5x%G(2JZds~Os3yt@KJ62?Y7h} zm3qQbj~B#|ih?Q^;cFhW)MJ4TUde~Am3ka!t8tK7j0m)Gd>nU{Gd##b~2WUj?$m#(VoMwZ|9ff%epw1%$(} zDagAA!2Ia)n>Ze=`%|;m%Gm0UVI8*?vN8s3w@fvK2Qk!sz(KV^p+$sYupa@LP(!+^ zYl^g;AM52#@+Y(NQ!Cu5J?G>Cgj~Djyb!=u-z>mS4IgF9x$w=;SfwBE zu2xzL+=5-snbE+pN&WZbkL#Z)Yj%#x^Y`)pT%li`JFjJfH7I0X!2fUH{||BRhb{L| zqz*7?`I}#uT==WYKYMlQpFf$}c=qM|y-)x2r^In=`Ixuz^0B}#v>$Oh79Ghy*77NK z9NurQG*~OHsDR*iibolQ__rCuxAkzHpEFzyXSM9&Q zXsM^vGLEZFmdmrYTU8YtOz|COuvjh|kY9csXrivJKd+SeZ|;Bo`+t)IP(tX~lNj*! z{)t*v@UOedS#KKum)85$e`v+bBIL2cP*>H0T1I+a%_DbFT~?QHeG%yt^8EW?*T4Rk zo^_lxSfI)bJgp#f^0x~q=W6TUBrf2TD_i-%#_E zg=!XMfhwspm_$Wj52999a6iPoBFcUI+EUvU963n|MHtd+qct0_4ocV$LIuE9kyer( z#+vMH9shH}3m?B1081JTZ8=p#+n#zEWd*cCx=+H!n*P+Jtu>60h9kcSPkIW% zQF5}tVl}DoUWAx$lc*I)9T#o1^1G9U!I(oz6t06TAo)4-M>XhVk zyZ97n?Pp|6#xV|*sS4z<49;i{w2n?I97pN%zyF0CxZbbm5I;$E L{rTVjI}ZFeJvpU! literal 700416 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

r~ zm*w5^0V|(<+VW7n(7do`xh%b}zMf+7nR3{1hRU;TjcpemAIF&f1ADQ~r!VVdHk~i@ z+3(D!au&(K?GZ8Mq5k{>>>l}NEj!uv>`6!ES{t6)>5@Z;pG{Bwec4EQ=XK;TpP887 z_QYqub3GrnqqQF-&zk%^wQINKbIp61Pdgrjdcg8Cz3ty&f9Uz%vwS`010*l^8=|N3 z+IVaKsJ^oOb36W6J4^Lq>Fu~f^J1pw`A1JVD8HWL7s-{~Pc40j@0q@5Ijp>4c{xAk zSAqRU(gRBuQFr3LJ?X(Bw-0c#+kfGBn=Vj4nRPPQV?#%6K!2V(+_ek)y{s=*AGp6; zYNEIJ@Vyx~3<&?7+t;z{vk|qcS$_-E9^X@ZRBgJFo;hmO3G|F9J&&Go^{0H2KcU`f zx8nef7qtErL;s=mFXm6<4&_7koXT&O6okDEpiy|3ELejNG%#s^Bzc($utU)GNEeiY{4 z_fdLJ?e6w_Y7D=K8e;r8_~YgoHSI@qXSGr}eSB5S=ELjtQ=TF|5%rMsGke2Zy$$^` zo6c8D?k2t{-v?G6##^}}>Q>V);J2E5*naUlKY=&UTW&6$jxwn0x|99c3PU+86kKqglJ*|J?yZ*)f)K`!7qxgt=*x9+j?FVky z(^m(-PWePsE51EK{dx43J@Z>L-^w_}`>L-Sud?4uPbYr9s-I2Ih>@54jGvr*Ym2Ay z{jS=kv+)s^K9KVM9yG+)+Lw^t;%z>}r=KamuUcF^+~41p=fGLE|6S?!yY_JX-}*Pu z!w$+nP){3wA*!B$y(K+deLFp4t{vj)H&yh`_2Mc0vVAB1gx~x-`(%GGyWN<6Mv0ZH z#jJ<e`$GGk1L#By=lhRh_dY-+VPjnIOwUjjs5hM z-QTkFSgOZ$*#(+Mus&40X3J~+Z1_D{`L-GR7pM=6-xxJ=kpJ|G@l#`JsT==zykWUm zPpzGes9G~0^^`4-@A8Q#)^j@__oSScyM3~3KJWe2%FFd(=?F)EurDs%O!)EC@0kC( z>SKNN^}i9%<+S}b;`(n`AHBtM`_Yre>4C5hG_KwWJ3#%WAM616DJeIOS$g&ZBWC}P z%E$G@@vQGX-$`$N-EH&v=3lnHZTrHWv%NRt>YDHD|FfS(`sc%LP=6vjo0%T##$Q?f zYz&opP%l}J zExo6DzV~bo=4a={5z%YLXY;Ri`_Vn|BoC!0eX#2*ff{ATtEhSx<)U#Sn?4WoR-(7- z(AYmXnBJpmJM+wOep1ZwiJSd&nonl)$$syx94ueCn^$M2qjhGgm$l(ZPD)39O?Eu< zwc{_&8@TqNdZKiU|NJy6U)VlPX8)h(Gnh}_LGhmI4bOJ0!kkBls9CO`ugjj1ohH2@ zdu7)#JeB*H&Bs15k2dx#Ecb@m4co7*U)8hTSkG*~^<4j3laBpI&d>UfJRU(`Cy|`+ zD~-Qk?FZT69h@Dv{oHr{X2kh1fg=By#yM`Me}}H8UFUSxzJ>L(-83tgjfei4b*Mls zHvVsDXY6~Jj{RgyA5lmBNPIA_7)8&h`n%~r;d)f2T@BaoxLlUMum0ik?X5l5*WRqJ zcHECBTfRW;{E z_1o4r+r@A`l!@o~fB#AQcQjtv`3%(+{e|n@yq~)oeq8v6_^fvtXUU%Y_&1_jzhBGy zZ+4%}&g*Hsde5vMW4u3!`1sE6h^Uv$dl=uF-@<%tyr&-i(DJeUiRZn9qd!mCeNrxe z_-@Y!M^uIBKiF3_<0H&J`reK%@<+IOS&??AsNzv3U*=b&>OJ@?%xKiW^D zC)-u-=XU=L`>E#qmS^^1h>qXwx`wS6YA@!)^<>{8W?zitvinm}*{{o{v+I)Kew(Gw zarEZGs2(^zyByXJ#yW^OHxe=Xfz)oVR#^FZ zqyPIP8_)X3^}+8f2jl5nXV3QF^4R$B{*%=!zE@$-qfx!^d4A^0@7eNkd~fy1^}_eJ zdg{}<>WTSg(`V=3HiF9OtLaZ#{p#)h!%lJP4}5OW!#7&&JLkjiTz~vrUp=y(+4Rg8 zevtEr*LN=?J70d^P`Oyn?0VsLX8q5WkMPva_8u0_*Sm9^Pnz{BPgUJS^~(JreDb)< zPnMVE$bPqSWvBO5A9LRZzxwc^&ByZdjlCgzcG zzud~_sUzGuwd{QhK4(Vfw|bsuweP*pOSxV7+%~7@^Shj$-s`EeruDT`t>h!uaxu2ezM$*U-RAC?J%D0INJ#>Uv_z!j`95b z&*~@4pYx^lNz!NPzoa*OPnP9j|6qOhX8X(_-uSHr^Yj(V&F?HXy_0?7{Cmceont)v ziJY!Cd91$mZWsRB_ivd$`;k56q;ZJiseXIA|NG0_$IZMyOZnP+r9X5{txEZ>ISC(icY_?`PXzjJ@(XV3bl`n2apeRa_kk|Cn@`_Yz<&y!}; z=Q%%~+KcFSGV8d3%Kw?l6?OBZ9ChwJ6wiO0Po}<__H^rmHXn}vzvur}eJmSEZRE-R z8o#r@N9WN=Z|!_NqCPSHN#MRm5;gnzmjU%;W|3^ zhwT2b?sw+1;m;TEv-XwtGs#}?zUD8r|JxgX-Z!IoY7ah_^AXlD$^Nk%+3$AW#CQ9* z5%tzQN*_2sIqLQmbKJgS%{qdMP2OoF$ zS;F%>+&}p_!mZ<%&9?Gp)~Bbk<9ka->#U@A1F%0${xF^Mr+E$4D~&g_k3;o%`%^X_ z=3~!c;9T}Qgb(i}*mYaB16E&&Z{;lF6DU5vMNi6??=f(@@_B{q^IG+8egEz6DL<_H zn|pnMyO*%$en!vqq|cV#-Y+3}u6OG@>&o{(O-Fjd>(#cMBkDk>zuf=19(lc>)wLtX zTl!GXn0|fF9nHG1uYQH|6;w{1_x8k7{V5Y4p3_`gJoTqpSRW)kU_L#|Mf}-b5x%GW zvVI=sujYIg*9Sj+cmE^Y$11=%T&}lYf=_1t5p({J`IEldcFE4)>M7B2dMg+9QJ*LI z0(FF2r{j9C_fJCp+2=^I`v>bg*SF;prf0saH&!14`L5mi+W(h|&+Here^I;iH|vD_ zeF~}*`V0G?^;>~O9jLN#<<>Pi?yUqJ<_TFej?t9vEn;7TZIiU5?^F7Kl-FcOD@uhMxUtZT`dbT^f z4^H<_v+IM(%kj3J@SO}(KY@{-=(FpK=`B9u>etc}KU?1L{w%$dz2p0@wtnn6Uc%e& zhGeE+Te-M=oWAEf(OdozxfgA}>tNfRwV33~#M}D-gy(y*Jil0F_Cqo5!T%;X%dsCu z`ndQjdg9#KZS>4hd);jHhT_RS-uDwdBkEc7ccP!`?D)yE2=A*2=Dt-#z31Y;GX6tU zJ!{T)dg=qS4}FHjMk^ zuRe4v<-g{B|4)Wbpw9Wmmg@zq?^3x=#CS;i{gj^4v0R^2(|bh4om|%6jH-)}AD#2D z^f5Ksm7CL9KRi5FL+Pj(|INvH(Y0jWIO7<``k1pXA2$DT{k za=wJmmGJo#d#;_&<%IHYV%7yB?mSYU?D?9gvgd1Z-1(ZAJ6{u*^EF(Kp6SevY ziMaCgevZb@Uoy`H(Y+LsyC+}1UviV#=cc-+KQ2#rZi3hSS;du+cbG`99j~k4)>ksS?atpxkcKe%W8ow!= z-*P%T{&Tvpeb_Iuen@zafYY%YeBPGtwOV~#lm2DQ|ERp2Zh)Eh`sz?Kp5WYrIUf|L zTFfJ|fCQUacnj(EdLNdV1&l3S2zvJMVMwzKZo9hzI@g zxuTFC)A4+T&)wK||8JiYvQm*;taty;llm?D5w^X;d&OK1dtMCRS#;|m*8j*pFBIwZ z`x5-!3El^#b$8M?%g3JcCcU!jF*)KFv%falt<(Oy-?2XFe#!^?!7hFFx>0ZE7kaBd zKF7-Y@=V9`fk~5We*fN+($F8D3klDk?CJbf=HJ^hJ3pplIr;qr^Zk`@K9cDdTPa8m z-iI6E>TO4N4(90p(tG1Uw*36$dgb@*{8QSs!v5ZQXolxm`G)|Mt_Kdk*FK zpXO)#ad@AY`JLzbTW`YY@y*;@fW~bx#&0n_l%=h>B$@6I*_wD>EaQ6tq z{e)~fdv9<}I%{{~2buGp;W`+dQ=@qn`vGj{xxM-RVfH)M3$M@dlhbqg{##F$XYJ*} zITSNbiT;nzXLC7uT(a+BePx%=`d#p&GW?5hKgIf8m=U=7B7di0?fB4dyeSMQj6TIg499p0uV-JriU&v)^8hYii=^!tbp){md2C;zQE zzWjO`$F1ubrsH)kKCj90u)jFtR^o&2xw>a|xmdsLlk-G-W%+CNozHQFbcI;gp>kRO zE5x&Z$@O%Tvs3(JIr%x?t#hz`@srz|=@`#X#%GU1EI-Fz>GmzMzjMj+Io^NbC)3;U zmcNI|zvmL(e_?vtZ+N_AI}v_IhT}h8PIVNXQ|fE=XVtBiM}9*18R1`u^E~b4 zASAqgL0>#KN7%}{%w9?z2zsu4~>I2B<8!bpTs z2&W;Oj!=W}8-&paXCR!3FvhD^XMsnpH&UJB)u?j;Uk>~PgsTv)Mz{vykI3&@geHXR zyh+|2!2JoK72!^VyAbY1n1nDH;U0v05!w*$LzsdxOhMWyD8mDIpNjAZ!lMX}AxuMf z9N`Is=?G6EJcaN)!YqW@2rnSKh%gsn9>RQtg$RE|ScLF4Wd9J)r3fD({2k$AgieG{ z5SAhQ6XA1&Uuwg(4cPc`ye!^8~u$D8dS5t8A5})$=?#8LEY^C8lge8_}d~hs9XH) z5gOF3{!R!D>NbBDga&oHzdJ&Mn&|I^(4g+{haxnnKlukBG^kepV1x#Br++9ygSyK< z9HBwo?H`TMpeFgpAvCDT{z(W8>K^}8ga&o5e;PuAYV$`UG^qRhvk)58{rMOYZ2FeAl)IbG*h6uF3 zKotTVCD4fijS^^#Kw||OZ=j99`5FUl4rro*wgxoWKqTK(fo2k$j^JMEu4W zh*FFd+%-|=?Bx(d5+n>{QV6cEpTd4U;R9Aqqhm}0vv9*Fw`QrR)MCeEB>t1X`m~O{R%th z=K-4Ibvo(ic!MD+N#EhMIb4TVEVwuzD$znI$0Bd9Pn3EVxG|>nQ3ZgW!S80xH8{Pq zr#cMu{Aad($9Uf(_DzF3B7$!}8R+9rNgI@^5H1y7%Y#aNV{ow(tjrbOMu4csE4(MV zlv-tCp92&`2)FSMh&9m8fHpVKIH<#R2D%Q=j(|qRNJ}i2smLP@TxslYSVPtL_gXMblryY(SQPD zRelR7X`t%>6&dJZK*a`n2hacmeF3P%K#?dzI{-=>+$e!=22^Hn9~#_IOO^TupmM=A z$G%68isUGat)yW?096_2LO|69qS~nT>AL|h8XSGeW08TLLZ$ozP>t}b_CMMbzaA1( zs#b7y!lh2Q)cMS%&Sx%llD1w_)JuwbNl`B;>Lo>^q-gZ#Pg3d+kf710J$2IJLH?=e zM~%QWd)u6@)E^0oZ3&HS2DHF?^(m{Tll}T*E!1f8xDT;SQjSKG+Y7+8^uTp)uhfUY zwF<6HWN8x#n!Tl`!CuEn7OLk>0JVvvgZv|*om(2*xRg?qZ=007&Hs86ThHw#?M|SZ zZlE%gf@<({d0;^zej9?x}wdN%~}EK`xB+7%rq&k0o@z}k-l{J z+-o~bub^Jm;j+a0m6BJa864p(-H2!=?K?&I&x>eQn!Iinbb=jCUs>mqxH{x6sc^|!u_*F~VYDrri*>ivx^Hbxpwwy`DtUZ*g` zbS1(iEwO3IBQ3F&{xrv>QerE^*vRV~D-u+S1Wi)%rpU^BmHHcGZZSBriA|<2`~X~2 z2w4y>FoRW-0Ztfyf{K98hzt0Ox&@8Y6_1W48anp-Sxr z+#;#*MN(Ibq^=gmQj^&~UHuYEPq|SZON5{8Wq$-e$O5`M04+8pC+oO4#(wtV*iy)H zw~0OXPfFcypf8|J4;$#V+Zmehl~Ruz+-LAvVS2%3H=G-K+TdRJk)bKMp2O`0pJ6t| z8jC(3P@$3Fb(3Nq`q4XpIz{H?k(KZ*Xx6qoLS6>V+7|nF;LJ#Xc3&+1%k_?Ry!ZuE+~Gg+{V;MKsQ(5H!dix~->fFtIbhd6I$HtM4`?dIY#2pxD<9 z#IZrZep3)I=OAFtLGU^Jd(x&seqXfA`$%h{PC)(RJhMp#>_;R6wv)+#NA_gE{jEso ziiEC6=!%4{SZ3SB5?dVbm@>rw7i`^bunxt+uhH~F0Sz!I$VLo`kA6U@!%Xa>=!0Vb zmGp=uuX!ABSijjBXPpVk*%af#Lx2{T8SZ0%thf0bpviu&^S&nggI{sIEH)E;knGbn zrhohmP}-F3a|3Z5q(%C4Kw}Th+0y}ipNzbvw3PQ6>08&BzO@=$#u$Ae)vkzmXz6@F zWBi|%DzyusX75mF$svHsq-^B^mB!zG5k4Z(#U6%k+zqHQ;MIkyfL9@!V>>b)Z}3(~85* zCdKD;Z_m*ABQb{sZcwBXlHLVqY-}Fp*!Kf^CN>}UpB@HO5&sSB#%zOo54d@N>Vp~R z@&5qS*Ub37Hqfy5(0^g!`g#{5H`6~NpF%e%x4z!h?^@}Hn4U-FC^hp-8cBwT%tIo5 zp;we*NMwJPc1R@l4&%ncr?#>4S19~8IMGeR2$t+ad2F&8D^GwL1GZ9)0b8k2ahe|; zg4m`W?XetoXf$vY@e5GO%MA3T_RK0oMSRC;N?m1eS3pmj0JWI38$rI-fPK-{fIZ9B zfIZ7LiETGMU^&vZ2khmx2Q=!gHaNP6`Y!{qJ!lhtZNhK5$ox#u`WvOT_!UOj;9&UP zRO8Jt>fMI`XUDBkfaaJKWJRaREO3nfIdtPL#8yODiyPD?^Wgm(-0{oM;{kO9?@dzb zdBf$Wkysgnwm%bl6Ls(saAV?!L;8;ajg1rTGeC=ijQ|xEQLC;5w55SY&9WL%8oM1D zu`O`pQEHgM?TOw)w%x8#kRB}aQ!aLy z|4)=7q&wB5;MQ+8qy1Rm8scLxR$NQ5!H{m)13=4r$nqpC!y_j49*oKF8;Hx+Y3RNN zZlbYpIZ%Yj@zs06S`ZYu3nlLZXllFy<)uC|H8SiV%#H~csdv!iNFP9(12-}9Zp>5t z473c;jwbC%NSg*^*JKU^)YU`2-{5?8HE`V`eYe#8GXI@#;142pTKp48^#GuWk^2vU zw*=@J|B=~t>@JOc>)I$V>$WsPl*UebS*cHnF8)zF)|LP*h>_j+0nqHYK#@%*+TJ}o z!v5Oq$krz?E_D(^JD$kUErOf&y2UMsoa_AY1;TGZmO?RL6JLAG-Y zppW8@J*(9D2FDtkj8clrfm>!uPVG?|n|G^HR|8iX8;DcDBxzBU^|UC;x^|+eQ_{}j zXdA5U6G$;Y>bW_#c!pB*fGg>NqgMSExU}HPqTIX7qZ7%C+ytXlR7R^Pk5<)D>Z?~E zHf09kS_o%VnG4H~rA$F`s{cSR!Ri?(D24rh;E})ty z*U&PbEW_KtjfqW!J@^n1R&ZfYI}Jqs?mtZ|t;`+{D?cVScd=4m0XN>%Db=56?Br_T zynx!0#-oJMcB;Qb;-9d^PZS;>%TRYS@m;>D%yeUQq zqeE2kzCj8jJJ_H` z1|>FzZaf62UUXx&KWr3q2)NP&)$W&o8saBS!X-t6yAE|gxFLy;KU8Y_z67OUJ4*p| z8V`yrdXeEr(DDfD!EC?Eah~m;d#f93gWalazZ?>Ljb1_RHY7OYX2y|+OglA!N190d zn$5cW709hgWNs0CZj}~n6R2J2_76^n1aBa1Yn1KtbcvlQP;>0D{+=q_3?p3+-2G^e zoq=l;jo3f9Q20H+*tULKl%a}XGg!8sQS+a$IkD1;W6%+$V}(jHyL4n2t!-Np{RVj$kn>y+BHW6EO0Hk-&trVhXM~k`e6Z?RhIZ?)KFIiB z{7h>>#s^>D#?Xta89EjF=YV)bVzaW)`o`h5u8V#u| zosX6=*3st`@ck1%kVS&b37==AQ-copaFk+lFc31o3`r~eonAy80ICz+D9K^(wIqkV z*ODCeUegkrme{n!mgO7`tFrkPSgFieYDQ zK``Yeco|!w9|@PHoXThIszy`J`+!KZn{uY0Jq?D%{cbMT65+LzcW_A|APdrIq^Rz^@M@8zR=FQ7t2~k!i)=~Ig5iY@35TPa(27` zV@d*jB3s3Fl73kJc?Zg&#(EJ9FsVJFQ@J=Fk`DXg1rK^Dg?Og}5A@lG}2Txy$77 z3S{n*Jh~*0t{nPOBys7=*=r#~UmeU4{Vt`Ar7r}K1YIIQR}OvE*2b~~T|Fe=9=}}5 z+bvRcOKo&Z?DQP=MS~cxX$3KE!63%<9K^U@f*9u;#JHZ5k~S%6lae+mX_GPfZA+mbAqpL9uWt7B16s$S=9D zA4Z56`{N}swmH*t*tbZ>*v6Kbd>=!KGRe10@-35+m&NFmGrIeLIS7p3c@&&46?A_ED9F5(5#oiZ2 zdGzZW<sh2t*who{ZQzg6l94m1vPbO9bjP z5J|AyK-4meVm$X-6yv$jk{HjFx}-#1Qlc&?QMc$ux9CQ<=tj5bMi6IvkTi2E%GY|E z2W^d>7iYaMinHz(#aVYdV?0w@DIU~9|D_u1nHLMc0Rk=a`(oDi88|ODGg9&y#w1ek z1iuB&j_gziC6Xc?=YClh=YCl(v6T{AC9%~abG67^Ei%_g+FF6?1R9^X9X96^%;p*r z7tDi{fcgewxAD|BfchuMzyDDnZyQ>-SY2*cF#0DVC`SyqqfC$L1E?lC^&P|lDm67^ zeC6m0=*FSI*_Dpt097QOL>}Zz*>xJ~Z%0LG)_VFJC`jB3 zPXV}ziElqd2HRrh8a#s2d^BetZ_2hYa1#^3QrptjW84Y2`hfUV5M=7~G=n3~1T`8Q z$=qZh>I;(%zey&R`Vncw)C8rN0^H>2$*Zse255-?)lBp-1HEvlQhznEpTIZ!6i|z_ zd5g4pi?n&8(UKjuLthmwX^rz7XL6Klw=vH4zD+dZ8UHePf;9fN#mVZ?jAen5`4I4% zCM~nj;K({Ij9!5GCADB_EZxsDdx6jRV^H^W&TV0|9tDX3YbILgRJT;OnFm*;ZeW+yIv7i(I8;KqQnUBAx-6b0Q! zMm{hBG{4%~@sFaLoy5@UJbaf3(H}*-zq70HA4T(4GSm)FpK|*s`o@V2T}ofGGq}^S z)@Pw-!I?__QIyvXKZ-5~XYyG;ihd2w7W#PwLzBVTruYjuTj+dnw$QQQOi+7V)(@m* z+T&~qXT~3amqD7dELs%v)Ev~o9HE;T=k{%v_H8$@#!g-mr!b%xyp9y$JXPJz; z%c5JN95qNg%Hvt;swmF_mx#765p7>0+TJO#of6wAvD3|(meJzGrN!7GLLSW#vKBuB zvg@L$L4+%ZXS4~RYs@%!E2?O@=>fDN(iI;Etvek0+!ep+Z0EhkKSFu;LW*ufN9&kf z@yf%L8Ub8j`ZS# zYb6tGEs}}OyRmDI*rEhWRg`Eu*Gg5Cc;ZQW2BRo36#mN#hOV?hskaPt-L7=0 zV()c~YPTBbO87_wm5T($-r--`6KdsB2jx;P<-)mK@+~*zc-Zi}3MHb`vz3Xd=w*Ke zt|~$67XJWLo#1tgawFCECI!`LWCvK=L=B|UfNDf@Y7#WtS)IV_IB^R`>>-F!(_up$Re@)_}5m^ zuD?d3L)3ekj4bV-Ye}$w)taE$*vG)NihQjJo;kE6*!yZpu=iE$WH8?(*)FI_4_DHYZM(iTdp(TlG3|O{KM*;c)v7JU1@|Kn-_IpgJ zZFVGRt7~n$El+%d8wE5^UY;0vx*a)}Cur?@u%RnQpP|v9OSlw!q!Ig@*v7Z9hXJTt z>ORPonQ$)Y#yN-$a=GrirS7|>?w2RdN4~TQQS4Q1iZw>0XcGCF5);smZZNn%z+P5Vz(J|CAr+U(z)EX%5tS|@%M=;J% zJy+&le=+vE4QFoO%3N;CF4MQD%`0>JpJp|pN@}vo)XOtSTP5{ZZDK#qhXs+?YKg7P zef%}dQ%r8$(v`V6j&o)1ThG|mugvW_1Yf`%jJ}`C^Qg+)H(ue|AV0Q0Vk>j$#6F#R zsm&!EX?BHwJ>~`nB6haSo=_Xe_b8L%d04&U0M&`4bs}k9F8yX8(bb8}vxA%G*pkg(k{^ST%H}z6sXAOv7*Q?##$QrIYs^~i~;07 z7x`ZtYR^*_`R8Jcvbg%g8Fwc1bOvN8@~;<&N0K5l{~!x8Mdyvt&%jgExTDL%HkL62yeC{Xh2>iY!j_94#+zUdUY-62ILI}j_k&OyjSa?alnN#|W~n6(k*riREim75y+99+t!hU}_+?yk@rDN$wK@6o%r zHaNO-QEH%#3+!EhDygf=yn8pb=l-h&S7RW$qf?W|{&P*efj}u`)q3*RugxS;h&} z45&?7t1a(QXA|3`725K?gcYD3-zII;W?GQuh;7myZF%n21Cys#Ly(z7Z?Jh^+z(a#|aE2PGpGpFTE)5T6$65m-M1d;6f`g zUi7;W7FsA?izjOt3uV`QVZc%?3|Oj#fx_x4$+9qD`4$E&-@<_9TNto>3j@w~VZiy? zvvkB|n$NorrLiSD*`5An=A8MSyV1&6-7WBK0nJX_a0pJ18Qf;j-J=1`%wzv~W*+;+ zGxOLlt~Y0tXa%h>ck2Z>eTNi_<9a@BC;&>DlOeMWL~FV8P3)P7ebYd<0{Xx}djq2L zYlXSA4!q3ZzC%mv-HG2H5W9(iwgJ>1kX@tQ!QhStZdX8sxmRGdb{|0XaXJ|{98iV- z*0xw>0yM|y3rrIr-e;ea_taB%zB(t5d(@n~=YS&*xk2rMlU-LK?K3$KtWxSaK+Umh zrywWvvQg^kS8V$}le4r9HyIGyH+K`@CIRX&xsgsT5+(E~T_9%y7esjPX+h-v8hgrOL4;Q-7evaP#x97oon&=)L1gah3~e`&q06AB zq$LX?Q`;Hhy{C>m-cRYsTRl>#P4|FxjMF(cvNTPyCo;`QMO;ebbPv1)bc1r~oK`6y zyU$Li(MsdHK8zJ{5O#@Pb%|beiC%R}4FyT=-3@WtNupD%vprtn3zEE|86??LNSYL6 zZHojd7HEKhXkJkwP&&yvo=&okr<1JXWfEH^v1Jlll;j#JPu_`kBVV~Z$>$;~d^*K& z$eys-$(!7{kt*R=CH$&{U$w+mOKi2o7E5k5l3R`BRx5eb370zIQYT!N5mmoFUjj$fa)tBmp%hU!8?hFMuj?Yv08j3{X>&*8rN5yqDUPSf= z!nrxN0{!S|q-_;kn}Mi*vHf!dPXFWUt=%FH3~X$>`9_{|h(jzGyI?^$;w zd2eh{l1JSoQh!UN{yL@pl1c7)MZ#sdaOn~*MM76BblpN1XwI!z=%z-WKF->WsnL_+ z>(O4()aaS_G4$3c96PLqA@4bccEnmKjV@E8^S7|);HO4Mz}5}hn{fLIbi!>o-w9k& zvt}nXYj#qzW;e&^G|*_!m74ML4}gj^&m3l()&1*%D;C^|xe2U=KMLFc{ovMiZZ$w3 zkJ%o5yLhKQq^*;*b&|GD&xJ*%uK?6(zKLF^S8QtMDRufAc=|La zsTa=m!nt1f)ocC=K)rCO*Yqs`n(fqUy0=YS8bzC$q!sFebK!3k?SqvQO}&eQE9=I31n}d-MKHuM!{7IRF&d3ukL~4Hm^zX7{4rd;|Hva z?T5aaVm+vp6g4UK0IE`4Lscf0+Nj1rR0k^q_K{WwgJ5^bYgrj|%(2iIS*se8o9bZP z4$m?4;Yz#LJ0|zIuNi7_5cm!D)F{ZeGB_e>_lZ{qm%9{oBI(Lt`6{I*7`i>3Z?-bH z=WUkd8OTCber513=Y$auo{*GqD}%Ef-O6BFNM$+S1gQw>8+*jXE|d98-x!~RS|;rkq&)+UZ`KTSdnev07}aRyy*hCSyle97mV4v-Dz$Wfl*-!~xMhHf zJzguV@M&itdH`0uJlYvZ0`mMY?Ug&=rj)_aZUIT(>3xk+Z2)kcUJk}GvMQbO<*MR* z9$|~~d4z2>ez7^N9^V8hc179&`RpMN$fuRS{eWx8ef~`=b3^XS*s(hjxKWXJF?X@w z5ux+m#{*X)X-iDnGk{Cy^Znnl{P~mYcUT7b=g!4lLBtL+>$?vDD$D=#AlyGU&>gVt zZvZMc{K&g5%ja9VmBOVmpTFKvY0{P+2){VL9BKChR3&LE^GkNNoGbJ12Sl7Jgd_Q5!)t`USsyWwg;{~pTDfoo=@Kvu`9ErFQ+3mop!yeK#?|;$s^Wt8pjWg$IiP^GZa@LoZi(l>4jg3@JkC_TIkY3 zmlnD*$+x^<;>KtXShMniC~VkP2NT41bIS|3rOONW3pAAl{H2;op{o?SN};PN;Qi3* z0^Sd;DPXJD8nB(LDd0WQAwGRMgT9S6#^0tAqXT5A6)ttcrCzwyOWM|eEoN)L7PB?r zZ~d)`-G3DJ)xfV&_%#W?7U9<=*1JVGcZn_T5?kCQwz$mrSHliLFN<)ACW@ypF_%|j zCg$FQ9zf^ACg#qBr)8lRkFz8D#N4xH;*K4-l*zoJEy5*gi*SkBB3zW%hy`K_pI9rB##2gqk!{hmps}F_`5>w1^>eAlfEm|UclcK zYA-kvW8=5|U@Z!G_prTS>|m@K45O8{(Q}o`2h?t)qLHrMNJU>PnkiDX7qr0w(|3y6 z3ur{7(X_qb1g!W`&zmFd)*K3QeNm}P%G+tmX8Cb>I}4U# zRgB8pDJAMG@Gx(tS#-D5K~Ts&Dp|-qsadV|R8b*Wl?#CDk~-*;I_Q!* zC@y5n)ghxxaUt9B;zG7aL*$!##f5B}iVOL>6%DFkirt^amqxpAcN6(`tl0K8>6c@66zDD}n zHPTbAF+ByY_Y2lm}&SjFKtdQ+#Ss~lqvO?;~^d+LQLLSe{3fUHy8Gh8e%M3sI z#?d0F4SP58ZIoz{)XO5VAd944%0+_mLSC&XFXS(~m79F&8;#{sj`BkOvRio}f7z{E z%2qCAD=!={$ZBzUA^W!Fg}mlbDSBWn!|21{;T6hQA(~wyn%&`ZE7XW)clg{M9X_{5 zhtKV?%zpx2?jmrm5I?&y$$8XD9(9sOop83_TcR~-yGNif63zA&o^HM73jZ^#S)Kq~ zy~x}s{F;Pclkl_mKJP+`7E^Navv-(y5eQqt}b*@e+ zN1No^F8P+^a9y>F1g$1t8l$F5-H(^K+IX3vjhB0xiyy7na%i{^&>cmyej4yi){-37my#UTmy#UTm)XIji8yaI9GPa?&lLS8RfQpoEiou;0*z`2;^(&mHwOW=d-0$i8WMz_>P(1-1KjYtsm zVLP7eL$;In6&Z+hsJIX7^MF1)8k7i^5=mPl<*1Qz)JQpo_)kG9x(kpNer3Y1T= zzlwPJ2%MZkD9d39DkVjgq^Ob5S?vyhu<+N=oDP1f%uMRT^}B2>iUp>|081S`tT@O+h@NQmD&s=M{OVa z4jP?HtCtk@lA^vx3O>V9+h-YkJvu)*TfPuBNTAw2KViHhevMKGjZ*SPDS4xmys;0L zys;0Lyiv;A*ym(-+Y@PB$s7A{c^mssdFlL6lStoWq(2sAYZB=jrM!(&-WEyGA}LyW zq~P*4N_iXqAFAFyFs}2i^F7CsY|F2SB)`UmIY@@8b=ihEyM%RNW+gB6C4q)G(0~JT zkPH|cO0WY2(lUeOQiBWa#%0OHxy&FL>Wf=ilt2S+nN!IZ6dWLpyEMgF<{-IX;y{fZ zAYBLU@8x+u&_C?oXTHCe=jA--ZD!7hv7H)-?;@TWi0>kv8i+@W*#W&L`90~u?7;WS zarlpf&az&fvUWdKk)xTldqccW4a8>!pP~on2K4S&y|Wgl&)3cl=v9k8i*jy2{}$*c zq{;%VEew2pXzc=RT(I0x*+(wW#s%8AXlfi@Os<05Tbvbb-RxaEP@ztdOZr2+k` zP7|VC9f-&KO9T2B&~z1F8hGH(ePv%7_>ElVK(rftuCYAuq^xoM_Ttrn2ft4~sg^1? z)q}~n;f}ra^$+nk!xfy?u{dZx`*oaU1pRcga1R;kk0tXV0 z)O)M%lFE0pWu9NLH0dj6zxCz4;@vgK8Fr8}>|i{@9$;%7U~4Tf8wc1%3j=X$9T<#H z?k)^OY9?c|epT?y8hz$R-&?x)AFAj!KQDb*82I(IN%E&geX@366q;n#o?3aWE}wFX zc7Sbkm^nDg96ZJx92nGXv~j;?=r%ek+i03?^ceFpJ@C(M**+3?ao}c{`?GeX@QtEP zGegtN&@?l2f*Cr&49zmO6U@*oGjw7w-Vw|WL^}5$GITbY((Wv?F+1=}VKz=M@)L~h zgpKWMWo#!I+hH4#J{53o;LUIH)ii4(`c0{Pk`bL`L?;>1DMoaP5uIWjr>tFF_ouAg zk5y#mR>gIHimg9wBl;(4?bKlZ8+ly<ZcP`n!1Jru9fb`Qm?wB1ATY` zW^X*q-gub3aX? z>9Zs6l8kcomkN1uQfSe($1M_9uKt2(zhqwhy&JvLEP3KJvu~ADrQl(kXZ?ij@X&=% z`?muR4?QFA>Ff7$PuXuO>UZCc66e1e_a{=>znSy}p~u)-M^{~|`&sDrzBO`8)Bc@g z)^6|niI4gd$S0Y#lg!#lW^I~TJHf1-WY(sscar&=rrtF5rm1&=j4LZXbzQ!<`GDL9 zka2>H6J%t4XF7i8e~PjBU!EBGE;%NmorONQN`L=UpX+@J?dVYaB=hJ{{B(1aztZvI zntwVgSHn{8#WlYzGp^frbcOyB$H!z}$oj7AljkACdyd&yU^Xr=8yA>^i?r)^<#&I# z?EB;{lY5oitK{Ao`h3g32YNT}#M~sKcT?O0dN;*&ziv~!@*RRcxayBTAy*SSWM4%a zG15EX3;bHeu1)b;{>qBK{3HKO&)u8imG3Ug(An6%DPC>v-W0FpcW;W<^1C%K0xJ3 zDi5uWR{)b#9$Fpi4Xuu6@uAi6EPj~zyTBebvMIika1`&JP0z_X)$c4mhUV`;{^Iw@ zH3PjmL9b5ItCRHQ6uGm|S?DR~+@^R0Uf2|mz!&gdgf2nLtKzp=@_xOx)nDaWHm|*p zWTfx=+@Pm7>1prgxatltf4!UI`a8h<9bopIodG-RablpUMn zI7T+dahzDK--^&<-LB1XmF(UeSIHjwa+1F6p)ccP+)c)QGWHX;7}}YJpx|pjXRmtqb&T znYmwP?w6VSSz9G~Z+emSa)~O}c)ntGbG&A_M7>MYyF|T9tiQWfUXm-6Z;^YvUIr(4SVK~}<@}Qhk#amnX#t+GsG5Wkbi=y7z%2Vvn08=Li=3H`3njm`0??i-uqCps7TrGXopE$0Om* z&GGnmb8|fY-P|0He>XSBtF+!NF}HV%w)?vDrFTngt#?c8)y>WEYVIamW}RhdPuFdU zPw1cOkG(p{=U`XuDV+T>|5xp)ZarF@Apd^UEH&&GP!#401ujx}*?ciVpXtkk>P zp03thtyotTp{hW(UYP$^fnytH<$aqt`9>ALQBp{vVLI zWVc-54G10Q?;D(4^V@$X&y0$;pRF~*${Dd$qVE^)PW6+1efoA}i_WCpGmY5#)8|rm zZHe1=_m=qE1iRDt+XQ>I#OtA5TjG}9wIy!pU0dRo9=AAM5#w9*`)m3n>(w>-7b^Zn z`ge7We!EEjD&5sJ@vjD4T@$~dc6Cks3l&$_#NPwG+v@4xxfoxoeb(;_>|XnH=Fi9P zS^N9*ejePjcI{s!$(w&ry`K`Ve)hh9OZ=;dyVl0@^Z{Er`mFCHba+cVBOcun&xnt0 ziD&0?Yva5;wk4jOr!7~HaOc*>**Ld0&c?a5aW)qDh4B+x;u+$EjYyBcCz;cN=YR^H z11fsB=j1t{g6Dt=o&zd)4yfpf&jFp-5|7@e7~3pkJImP4GNQ$vCuCpHD~iRQ_?^_n zp7;ysi#_od&=-6D{TI;Vr+v@Zr!wDrNbU{TFP~reH*!tNx{oI!L?c)nu^eRYyF0|dyB;Gw}{9@rZ1HTG|f_ZkPb#(RweTjRaPB(1GmcTMJA-;Z6#Q%pzK#XaTdy0}*y zT^IL?qwC^cahNJYRM}1LZgO{%yPMpjTjRd^*w(nOPH&C->K>|0Z;kuv9_sC(-X7}R zVE;Hly_3{CNtGMieGbusQ)JANF-yi-M!ADg9_H@zDRR$|yPw{lqso4Izn|Xkr}qo= ziCR^$t+)0QGvQcZqt-)LW*?G)Jy|D~2!1lkz_zXDgn!y2{9JKsTY@ zZSn48-L`mlGPEu3A0J%xyYlM||Mo8ZCWn4&W5*FzE-THWp*hSnf z;&u_Yi@0^$#{Gezx>}w)B3s^nSMVouOJy0rdFa<Q-)>sGLfO_AzX!FgFJ2jK`wzb(tlw|aXX}SH z#64hWL)-&~HpD$(XhYls`d96h_dNbU+BnSY9%XhPV|E{7CT}vz9UJ1k)wPxJTW~k& zz5j;&Q$HEsQP=r4D z?`>wQzW29ft5~n%^=Y>1s`N!aSB=<)pw}0)A zNNcL~uiYU%aC!&ycD(;4_gnhCwEnf!lN=pS zZI5Ta+3oS{cf!1SM{t%nzoypNJ;{36##Y$2DtEiS6;~|0!0^ zIabaBD`$a~bEP-_M&3!*!05DT%__PDlb#{=0-i*{?Jd$^)qb@-SWq+ z`25ko$~$O!-0kJt)Yx0hex-eq37+e8)3Aps zyQy+^Anp}cZ5+BLuWr}7)P0XBeMP_QYewHB^bYb$CN$Q;%h)0Xw+u|Aa)IdCLoEnJ7 zjZ*{hxbc+b>h~TlK)dYfRae-$p)b|_NVtnn1=rmckKRMK#iRF*+v3rC$8GUQz0H0F zML%m>Hx!SAyN6=`b`Ql~?H-D~+C3C|)w@OSCiM3Xd+ogk+p63xj@%Z1k!s|&_#L#7 z+y3Qy{M%F`w~fo0ec)&0J&N1(4o&a)cH3;+DcZfcYXTc#o2C1Mg8X4ionnafgX}jJRpMC!lG( zC!mvfPohoQ`CR`BT7P=i=i{$P|De2Ie13~u?~$=BeY1FNE36$_lwYrD%6Vb!x5}3O ztk9(WwoTXQi}Fsw-wEBiMt`sGRiRU~HcP!(w8#E^l#FfnZJ+($^1S$zuG8s*aTV*| zqtcbLAz7W?FTM@(o8-SNcD4MH)L)o=dwNOiiez6pe?s-U)6(>Jq+c+*KYdy3KyrVG ze`oqdd;LIoeIR|+UOyOK*V8Xq-emf3W`8j4o!0zA!GAdIx7QDa*FTzWu-6ZV*GJPq zdA&OM$#kpP$I>^L|J}jgNWaQnH^b}c^lR+(vGDqR=`MTyL3=%rd??r_g8xFWe{SO* zNG=EeE5W{Ic7yyj;q6jqL$YC!nKai{s_6@;i!QL6{UBTWH?7hK05bT4&9x}Tj zIovaE<9aCQj|ThhVB5i-4)#p29|`v3!9E@AGr@i`*do~TX4lA5CM%EWe0{D**Tq2c zV(`BdY#Hq3V6O!GO0d_0eKpwEf_**Mv^UICu(t-g$?OLC3%?ts{S8T__kh>|`5RLj zzd`=q?~J|P8D77!_oMcDG`!x``;5F^oxHX8k4?YJ^nv7U!PbJ^8|*#7J`n7K!REm} z6zs#nJ`(J)U_Th_hk|_~*e8QM6YNKV{dllX2m4&G&j^;HWAM69cJ{asn!9E;p zGuUHhHzXfe`2#Zk4f5Bro-+F@EC0~ut@edzRc^&3 zNL~#3D?z^&^jCx4zsl!tz1bD=x6!p<1Ia#ny+QtN&No_n_t@*z$valvYp?GOulKL= z^Ts<@={j01e@W*%#4qb=)puK59^xif)$R4c@cIW=9kkbn!t2AUe#r8EG~_*M`hfh( zzW48mV9x~m$zY!kwhZ=iuvdb8E!fwCO;>xpJA=I|*tZ3{FW7s6z1QsOWdCYkuX)f9 z274&jhl712*hhms7VPn0-yiIg!M1}v9qdPf{dllX2U`StKG?-zV7@%%k@M5yJTKBB)9bctl6RdC(Ul{|Ag5c{m+Y)^IyN#S)EJ=d#vBjm+uSqM8EI1 zAL#e%jFbI-{P|Md`3-*Cv z51EzzhS$f!>-Vkk5P zK3%^bUjI(BXV*U>b|Cpki2K<3-!T2D^)H$I#QK%T)&ETJpIbjFuQw!}^*?TQVg1u) z|9E}x&#Qi6{db!E^YtGydvX1Bv!7f4jlZD&OY475>_GBTsMlTp*Y>&$ub0>Vjm7=# z`hPKdb^R(ku77d;kl7pShi$!N8+;z_F)QcEV9#yv_0rj(>t#doFB{%2@oSQs8-Cbq zvhk?czNB~KyUniN_%mWnHTf9GCe~b608sf%7+}lIk-68HBA#VRI-k*2g;{7>ri}q(t^588m z$@mA7-0BP@{kQtOj|TgeU|$XPwP0TlHXZPO-V*H4fRAJAfRAIxfcJOA{A-e(1Ad+S z#t=6;;OE0#A^xo)e)oWn@9PJ=-+KnU-_-%1$G3;}?hbX{5%S*|^aDY!n?8^{X}TP5 zgMHhek25zb*CT@;vU#{-uU98u9Mtv)l564hjloaZI=LBMCqrR-4e2-slD;9Iht)$m z-U0c$_xgH8k`3uP97uNBYq_otHV^iZV2=g+!C)^3`&zKC2fKcg_xmlu)`HE0eI(f9 z!G18lV2ZPOneKgp22m4I0&jtHZu%+46N#71{ zr$5;B!QL9|wqV~9?Crt6E!YQweI(dNgFPPX`-A;puulj3Ot7y7o4&#O@rGctU~dn0 zU$74bn+JO^*fYU?B-oD!`)aVS1$*yTcsut8yX`Ce^=Pnf3HEKl)`Gn^*!zQhIM_#m zJr?ZoV4n=O9qe;vS0vAWrSE^A4f^ZBrWNnUt-)>zHV^h-u#X1&?qFXD_FAxgnb+wL z_MTw#U=Id+DA}$ck9&Gk|>V6caReJI$6gMD|f&0voOdpy_=2K%94p9uCzvm26UzDkdStCPZB zuTK`gN{>sjzP`$@|6U65uLk>Cu=|F6KJE#&HsY`M2755rYr(!6Y~N0g%Yxk*>|Mdu z%x*~Xo!YMr$-!U`1^ZC251U<`ynE*t>^xM){IAyftCL59ebnrRd$gY=5xZg3W_{IM`#selXZ4 zg8gK$qi^(j$AjHD>aRzGeOs`#VD|>QFW7s6y*JpW&8|omM}0d#7xd?YeKFXVLR=Z* zE(iTeu-AfpHN?GUaVwJkH+kJnZ_<9QNVbL7S$KU{czw`buTBn`U6VZYCS8B)lZVX? zB##9DF|+HF51GC?dE!la9+&q+Oqc8YU_Tk+i(t6g54SHsM)p2TSENpLBG@Nn&eo}j|ctz!9Ejg|1Ph;E!ca5Js9jG z!M+;oYr(!A?54M9{_13#*@5H@!Dhkk4R&9!_XK-yu=fXhIoMZ%ea-BKWb|u&e|d}9 zf#kuj_5LpYC%2b_edVqG`jOk+Zo0$mbN^XwCPjWVd82$^`D=uJA<=E7^!a2$zQzA0 zp=af9D#|Zl3avG-(qOVnJ`+*8Ex9w$aI!zpo0A6v-I1IQ^k0*w1C1r04)iU_ggmz`9U;#xpz{{@QCW2_Se$OlF5VKlY+l<_ zh?BQ0L%kI06Y?JP8)>~ks6t!@4GVeil{{Bz$_xlJNUPL^yh;uoB<=`t4ZKZgN+@hWi_;l820d=1ZM1~Kc7tYwJomK4Y3`hn zW^{-vpm`zBIB#*9v1p_jFF;-5N+EA|2~El8<+_pPCM#p*o-ZSh>l5wSDQ|Q^`yyV_tnzmLG@{BQ|u(iyqBiakyXQUZ*Ayp1+ABjmYCKBCi5hq%Htt)k>r=7l_0$#c&`FBoY?SI9F; zXi3O(l|1({bj3(>lT|S{g?fZMSIKkxpg|+etq6I$88j^9xk{e9Q|Q@5j}cYkYS5UF zXDE5beMZ_wowyvD5b_Kq&o~G*h-*SqLY|@I8OMa4O+F*NdfYT^ttAw;AX*!37VWf< z=XUTG(7cehrsS*E5wwPo=Qg1!A+Mt3RgOWA8*P-nw1hmj4b2F7u9D}ThUSbmN^VEU za|>u*$a9rE_XVSklF=3Nj1pQB@(d-JeL&z&P(Ue@967n{bybUF9L+N^QM}L|e!`l+_+%_~LYZq`Waokr^jdF6Q_udL)53qpSVcOI=P=Aiyj3CZ!I+Tej+&3kp)yn5|e2)TD& z$mdGQd$3@n_0FR$qIHG*uDnE3@_I|=)jlhEy~|K4-x~LK{ggbTN634izn1A48Qx*M zJMq@=j^R}b^9St{dfDFJtqXZ;6GGmal4l%*4hg+1f2lf68bY2iCFB`Oo^cF1F7&d! z``Z%oj2R)%Q1Xn^&>5kZlSibDj*w@}3wef;XDIoer*u8}tn7K`@h%FzoV-V>bcH;3 z>C4EgsOD8J3%Pbh=;h?+Bv(Gd3b{&i$tKxuJ!ndv(FgSly_|eNa(AMQn)ZZfV?y2+ zCC}Xp?Xx(2_q=X#y22)m`U82!LD8HJ3B8>Bx>TMbPRYGWKDJ|M$Aw-_eoHbQH_i46 zp|E9y!j>_w?h7+QUgb2}8KIZ$Q-DG!Y$Kttjfk5U^4#-ii$X6aPe~6-AQ?`Pv3G}7^ALSAK9$g3!Ml@a20qSb^vV=r2c zHX-Cyl)TEMk+yaattsSHri460$uo{Yr=dc~GZswKdgt+W@s`k%kXKgn%9kO1jMM9- zLVlO8YXOY9a2!(kO3iASGM!I5^JY!hMGn71ICp3mv$-R4_3A_igZhR1{$rRpC6C()jS8)`Ytb>{lss-PlnZ(P4x%;Dri8pNN@1>`HgPk=DS6y! zs32~hI3x$FylXu}q#$3G>H+X;=~RdVmRkyhS| zmZMDw`5Y*D#-xy+B@d!a5vSyFN`7r|3~h!uC6AjGdNz4f#&H_0FipQ7rsUgbUda2R zaCY(e?@Xu_+hw z+zBDiRr1_}&>^aVQC9_#*C0>D0#-Lk!ZfX?h zSVKZyPc^SME#zDE7~bPT{+?S)$otn8@_I9-Y5$bGo|4x)jdn)J&vb=p+UI$pu&#(x z&2txsJCAo!$lr(S3VC0ajI;+z-UB7CvTT~Rb{X##p_k?9O?f9!epS?~^cZOsC9k67 zRr=8Sh5Q^kEabULo}uI!BSL-@*ok*k$j_!#AxBrfJ5c zk!^kA8pJh)!ZtTeGp2|;2DOQsA#PSE9QlbWh?^&F!Q%96aGto5xFzD0d~C}`wms0& z9kHi9LSa7_@{B$xBW{?uop?uueAa5jjS;8h_4Y#hgghe`^0_*Qw~2NPt&KJ#1q?uSj&`BMrbhib%)5vSyF<3?IcmYDcgVc@ef}vl zCC@!>UcK*`!K>unGv?L1oq4=U?p;Dta;>MrD1}_hgu>RsJB)Y4NJmr?^0+Y}pGhUJ zqI5ke_1!YlG-E<2Y$Mb3-fs#`$#Z8+(|J~Mtq}6o=7qe9l6x17w2dY6YOa!dmyOih zlf~TOFC&kuiZ++rR?61GtK{CgdG8VL1YRZgP8w;uN1!RmY*+}O!9bvpe-uoUQkIV25<5hBR z4euCUCHIaSX&X6lO=wEUTT}9k<3`&1HgPk=DS2FhcOI{jdl!ZLD5~T~(HHQRLcS)K zguDkzo_j^ekEh8_-G6_klo=B8j2@vdLqeXRntz_sYnqO?U&!wRG9k|$7V=yr&mA?= z@hbWC{T+B~LgCs+$g7MAc@-tEvQNmb<#VBM?IYwF6GEP$|chX3=$03W;5jD}2 zyf0Ix>E1mp^lWmU)H^QZ<7g8%1D!Fi%^%vl&}Zy>^^4}U`4bBBN8A#$Eaa_S5%M*D zT`0`j*U0a1Ca>wN358jMdWC##^b7eK&+raIBSKzp)Z+B&;SRJKG$!P2?6Ww%j<^qR zj&}k&WO2G>ju6*`rieRkar&K($MLp=d~9vvW}q`dJ{xmF-urpH3qn5fMT@g}CT@wi zWwa|6rz5|P*7L?VUj6H-zWxS_VD*e1{pnWp>O5h1TPh4;95 z^}conZC1!fbjG~;J(PL83qoFH(Y*SdlO?=YOw*O9g1@XkQcz`G>m?JlEThkCv?dIyEV_CUMCH0{e6+Bk9d;hn%cDdaskLfjN_(`Yk7-m8w# zTyn>fd~XwN9_pI+hs0Z=EkVhD(%iOqQ=za`g}ibP)QdMm8-{Ao7?eX3P(x@gS(4V8 zXj9O%koVwmBb~LD&|I=>S*~7*n}OztE70cAUVuuxOVD+^>022u)GOqD88p(qWO#?6 z8Z-vw&;-Hs*aXJ6L=d!e*dfFYpn@Q5!XU%o2Ew#CC`{4ZWeC`Zvo9i3&eHNmY`+x_DdT* zUl-fx7Yg$t^q0v)vJ!{!j^Z6d+lMxRb_i_>Z3ddfJCC-2R-!FI%XpJJVoy`32kIB{ zV@U-qgNC6|;;KTvWt4oLYeGH;O0JDTbts1>ph+RmJ!GV_+Yky{pSUJ81x*WiZcE7T zx7v7TpblOo?_UAULyJQG?m`!>gqENyLVo3&?vC|(pk5*GRlks5*H!Rl&@eP26y^_Y z44QzN7N;{bg*F4tLkkwC`@)iu?r+OzJ$J@F_Y3)WhtbANvprPkFOyefJx}1Bf@Yvu zA@6+$Z5~>{y9jmhEu`p&B#>?Gy68B;HUrJ#?VuIV zJk*6sXbDRG3uA+NpbC^h!$N*NR7I;nV^9uFK$Ai~q6S(Mnu4Z@YopCT1vC$p&=Qn> zeH>d4ltIH#4H|>Sg~HZCn}8E{8NQR zAzvk3;!0=MrhqsP5N1H%vKvPf)YC|(n2P&X>XhFzF zR6v>B))GybQc*pRL3wdr1P2in^rt!|8%?kNA=Ft|2TSDs@k3AiR zMufcGF|=_ZuQ!18cU|wDKCE60SEaZJjznO7By+UCeXv0tq8iR6Z0-Azm zpm}Hs>Un$YK?V&&qe9-7D%zN7dJnq~?*!f{Xa<^xmY{TBY_|u>pkb&6jX^my0UZ+Z zcMY0oQ_ykq>ZfEaw6>6sP05d}GtjJ%Z=*9p{wZh&Zz1HlO5vysEeiRkXaGAKn>gRw&GnkUv$?5eny8;^v_RAMLp=!|)FH5EePD1dh!TC_O*Y_W^B1YI$& zexjJ%9edCN^$YomsGto)Rj3Xf7xEQ$M#y{L!MkXh_PL8zLRZYIJx%Y4ed!nSRa`;K zgnYb8K5L^Er=NXR(P~f~%Ap3-gxXLCDxfY@Ld!xv-sD?jUs5O&3Oz-uK{+&Oake7R z+RzMCK=V*36!vMfC1@FM`fag)Jx~S>Lp5j&+9%{~Ov)yyd#byg?gY0ltIJLsF07NiZ%v~r0WQ@mBQ8Z<5xX2asNjXK^O zI%Hm*-3D3{I&NOgZK1WHGv<9yJEGOw*&yiMr1d9|l) zv@@oyUoWc@ZPB!?qLpY@gu*z?yGy+3{ftA%z5PN*(yte9hIiC7-Ktfz8nn;6W0Fxv z%b^J&KfX)~g;5F}Nwr>sxTcW5!>8oO@o6E?IBwK0S13wH(sxK}E#lhHti|bh>x{)| z8->ub$wP8?yl9%P#4AR+WqQ9Ow$U%-+cHO+gqqL-vdHL2amjx11;d~qAd&gyMxJt zu`eS+u2s?MPy=d0(?Z^t7FrwXKn1iQD`!;XEg90H?Q8~D7m+Vw=Lv-K4WqEO;06{>kzkS zUcFOa7V?ZMUq=44XMe6^)BE#G$d7BIrs-YzJ|q2(W?jhlw_M1dgFIwj{R=4#yvI$` zJL@)D0hLhleR}+RS&o0HkXNpl_J%J=U(jko-rBg3k7J){dN!yF%_ZL^8HdoOiE9ga zt%R2GrV}wEgK9!PFG^l-pHMg-p-ozxo+S_AZQ^Y~ZS(3c2z1a2Xi>;p>!OuV zG8uc2LKP^3MudE>s%SN+4&~6KkY_Z|notXBL$gAj(LpPqE>sey8dQgJ zs3GL%MkSx2Ce(u3PzNfY1tDLtC0g zT7lMuN+|uo*wYNELE}O`r#V^^n#S8k>j=#y@BM;&(uGz+$szSFh&L7T8Lybu`!{lI zLaUlKCR$C%d!XbQ<3c_!b&LBciOcaep*Ga9xZjny0&PLaD=$J_i+fq(O5&0q(mq%I zR<4zWyxo2w&#jpE0r8HYjY2gc?{mZAep%w0LVjo6GVKM?+QiKYdF3-u$KnRANbiX& zp=BZORr{pQ3C$%lGPW+-GI3Xo`Xx7cSInqDb*KS#gyxc0bmgFRP5XwwlQk~n zBU17nBtNPdKQG=?C~QH~o)axYt3h@1Zhl$zL9~Wx?-H$v))w;Cl)Q2Qb%o}V-;<0I zEqyq~^$PhK&(KDNyj~40hni3uDxeZde=N39fikEH)u1|*Lz6<@mnK?EXfF9z8BrT; zmbe0~gwi9iFBw!53Zq1;LpgMaxQ5VNQoSm3kGBnVpaSYbC6pYEd##dhtrW_jno#H; zS{=&qDtVPdXbrR`bR2IBtqpac0$LRE9(2)4({xW!@^+I)BBf9UjSBe+tD)^f%h3** zroTMbLF+=vkH7SBEfI390#%_BN*>i!d|Xy>)o4+uZZz9U!67tF^RKcs{-VCZj zHK-2dPy=d0EvOB3paSYbC6qoE`%-~2s0!7fI+Q~Vs0DSP0_s8~v@GN^p1hmBKvif` z$m2RfbID)JR?XfMwGpT;sHn_E7Q}*FS3-*1eE>Q?v?Hg&I%` z>Ofs6`Po>x0#%_p)PP!02kJt}RIHamy+YpS3R(tLp&C?&a;O0{p%&DJI#2<1p%SW0 z$DUT98dQgJr~$R04%CH`W3h4tszPdO|bwN>It;GN=X>7PnF2N+^AQY^^Tj-+^oh zd6lM+_pgQ477E8nwB#3KZYmUd0M(!zYCOck5 zg-U2y$hUs-q1cxcsz4c3g=$b8%Ap3-6!JEdd|S4lHq?O%p|CHYb)gcklGjUqIZ_H$ zpbV-)H7FPI)|9+n6KX+ir~?&H7b>CTf5v(#RDm+63e})GltWFZ4HZxcCBLF)$tV9_ zj*dcM?=h__T835=^7X9baXHk4+E4+NQ2Ip7&7c}ohjOS1wS?x9H~oXWn}Svdd9Reb zSIeg9aXkIMoPU%X0T98g2Z?_8T`EvOB3paSYbC6xSXY$Jtwg?tTF&@!kh zJ{?y;0RR3 zJB~I9)&8H@ZXIesO(DN$Z=rRdE|mOQtWtrhP#tPOEvN%^g~B-nEontf$!BOp$mgJH zUR_~zp}FLUtjS!+;~J*@j%ZD^mTA{??V=S>*SvRpQLa4DlD1ZUk7%h-*lwo%k!TrO z4XQ&q)PR~$OUTEo&lw%^k)@g~0>Gg7DmWl#;up@vY{-_Y7Z zp)Y71sKBe_J?%otOw=k+A>{RxJfnn?*{G#ZCgkf`$unwbO0MOm={tc+t~H@HR6r$^ zo{kxrkoQl?t8|2X8!5Tgg_7ThT1Cj?sz$aZ@iw3q)FDpEE06qU9B)I&w?|7T^abid z%R>Hb$mGK@L&-DhPx_M8B~LEs0p>9LdgGG za|xxt6}4U=-$pedA7yTueuJ(FwT1jw1eLrm1yn-m+32kZdA$s+idI9bqvdE#s0|fR z38f#2t@Rq|D#_4lP+cgD4XuIJL~BC@R6^-TV`~{ygX%(|4YUSY6Rm~TMk}BaN`ITy zpc<4zO{fiZguE{WS{JPpdNz4N_U`m!v;ozi9BM)>A+Ov@I{EkmoK)zIo_ zIa&j)iB<^ttfjvnw?ZZqMk(ZTUqh>-z$S}Nojnb8H= z`Zcs1nl{p>t6M^INp@YfplO;>2!&ZQP3JT@mn3gae^}yDA#bB1lXkD}tEm@4Mr9z%tLCespXf?DtT8`F)T6o)N z9kc?ii&hHxtfkM!zGOl^8#SmdP=N`W&r68B~LE zs0p=&LS?86mBb}~8sk!-u$s^^v>KE{ZK!}sAzu;MpT&ALXk5rgo};y)0xF^OEE z80otUbs-;RF66y$ptaEoA@5a*mOdXdG9mZY&~m5=wV{qsco#w_%ro9DT8Sp%AubgP z^DN|5MoinNM|8a7LeD1Oq)$Nzg;C;dpf%B2Xl)@MQ3tIcZo$0YB9%+D-WN1OwM@wS zSA)jQYfr+VHBGbY10%f(FQD{dtdc=hAs-|)`gbwCjTqet3Xw#CFH$Q@^=i|LSA{+s9)AW zN634%fYwDTP1E(Vj5qmv{(MXN&%s0DSPF0?GFlneRT z8bV>@P#bSY$j94-N@$t5wS|;S}R)u^{>rjrj33Y_Le+60zr7y*Ly+YxAZ?qA#8rnG8B-F%PKqZv@ z@7P8TwV?tkp=F`4=lxaeeJT{zA6kZ1MXRATg?#?nXeE@&mhgHRR2A~Ms-e}O!8I3;B#U(3-@x(Avax&=xGt_7Aku;`FSWEXAHGd26Xq zSP^I$S{1DhHH3V;N?xTYo~S`)2>))w;qbBZC6>@I{Z)TdFv8!k`v^rWY6pjpN(-yZ;#@0e>Tb!PCJ7}e8b`y*n^5tI1Zsz(Ug3K#)bUJ$vR#o_fDEuXSab@$-UD;KD%wS4%CH8i_;lT z{yyfWLScr`GPF9He#hA38fZp&qkcK3H1M{dHgO%a0++qmPkpg$mvgA)osyTFv5gt>w_9#p$mEHHd5CEzE0IL8fUN%ckj-W!g&*gu?fm z&_>XzLOw$^yyJN5c$=o_)|$rK5}HeH%F&`D6!uUdANc}tC0g1Sy}d$Vl?crx-z?|Z z8s554*ay+tP*-R!`9;Yn(bAQ%az)5Tl%ZA8YG^ssz}te_cncx_u11NrY?|&Lz49;2 zu8@zs28|o(Sy$JLdz+BnCwfo2P_jB|sZdx$LcZ@;@Md^N%&XhHinoS$+(_3(9d83_ z64yd&qjk^X1R_^)~NTpg;Jr= znrWv+%h0N({k>>4v>cig@_n#jaeL%?t7Y`FLT%zYradQGfwo|zTeWN6Epk;<;$6m@ z%IA0fendrRF8O|m%Y?koRnyLhmZLRHyCGT=t!3I>a*fk5((9uVZz{jE>GkxNa-C{W zL&#T{{_d@NTWD>x4x0Xcs%MmV6ZvgP*D6pZ6vly8L#v}Tpcd4Dx=^wqwvh^XEk{o8VOF5;Iq+&)p zAtXsoF+yS@*YEqhUe~+p`P}PpuQlslYt7m-Lt3L^F`2GJ zYH_KR+Gfq0lv-LWgE>9TiB(FgI@)d3SiUc|Sv@U~)<3Dqi-?jp=Ld@BYsMKOoE0J1UY6+<&rIwOfT59FC zSzDfw)-0Ak?xj{KHFb>JKaDxPDv(;C)S^<0Nv%X`ajBKsX7wN;tx0K3Ni8k443>XF zC9PR3-)CvfNoytM^ieeRmxtn6oG2QcGaYyp}nwNoiHbxiyXDdn&a; zsTJF1opa)t(}Pl}C1tuYsiiPyZE0!ENG*#wOUX%1H*kAUC>Fz<=}NHtwn=M3YDuZ3 zq?X22Hx|CQNbC#EpS{8FYtC5phrA((zbl0Y_{Qi?#A?C~*v(4JJ5@}6{rNq)$z6Vmv zV$KurN@-OEvR*8|Ua1vg&Kyyx#q65h1F0p%l45ClI_o`;WzL?=h~>moq1&pld=I2n zD77e-zw49M60wA|TIQ@RB{j>OS{lpm7pY~XmXn%lTH>_*W#EnM?z{z%sJLlQcKHp8L4HZmXlhg z)Kp`49U9B`N@`KD60w9>5_9HANiB`#&wodX|>F0Ewfv#dDAjo zrI>DMZIOL!U``L>VhL=GYR^;rq|~xvs+GHrLM-2VY>k@E95KvUa>A~?Y%N8mON(X2 zbZd7hek}i_5?iBc@{GU4wsWwAZS%1d=Io7(UHgby1?G$o)yA6l1fJ6u*fta^!kpHq zU0XyghUNF9Si)}onAW7!Qg*H3-|R`LW$fA|)Ur~m6jN>8C2O$)u|lz^SWK)$EH0K1 zONyn%$}wl#vbI^*g-S8iPWpm5uU3K73Z)j6T1;vsQj1G1A+@B`Qke64Se73j(wY^k z6w~e9z7&c@F=yVG)Jmilms&zg?_{%bdNTvHU)j)&glQl-455`Q$}Z zT4Q$2I!l#EEpFGW?MO&1i8<>?Ni8k4jMTDH%So+LYU)(!Gv+MMk2$?6kk&$JjY=&h zwGyetrIwIdQfeuwrKOgUT2^W~sZ~l%b&;N8`MoQ(La9Zi7L!_u)Z$W0NG&O~l+@Bv z%V7EQuC(T)W|{MvS7P~Ib#><`#GG0b;~T!5J7ZESv1>VMNvWmmT9M)xg>9RNWu>)J zOm}ma?6=Jt3x!gPi6zC#WV#II^f@c7m13&9+p00A_l06bw%KO^nJy-+aj}H7Cb9gz zkJNHvm6)>*-NUs4Y>6{gr4|z_!JOVFFz3!KDXm$toZV_)7o?_oT60)6jpbi0sTE>Q zPfMg0m+2BxOG+&zwY1bSQp-v$C$&nc>0a*IqL|aG80PdUE|wHa$#iL{Wu%ssS|#Re zM`6@mUKGo(Luzrcq*z9#%StULH63%8S11+}E4Ix#HcBvOZE?)$OG0XCdphe?$cj~p z>CkTF$DI9KfH`v%N^6m{Mx`|-t;Nz>DwdGx%A}UUoc))^oW5kFmX%tCZPxzF zNo%FFs`K2X_%Y|N@P)Qn`zj_D7fWEy7Nx|pSpGE^Q|G(WY0POYkXlqMjyb(gilwAA zEwzl)a$=Rzss_v2FlTuMQY(~NRBAD)l}IfimJ%zsr?bbt)UtNX+Cvr6S|z3~kiK9} zUkWkj2#ZQT8mLG4Jv*eW2 z)P?RG8q4oLsTJ8Z`||=)i^+5)QcH=Yr8O&7DONbtT}Kpiu2BiGw6vCE&O70()N+`! zZR#S|G?wqP)C#2*m0ApQwmc!Vq)eB=oW7`Gu4&9!a#U(@sa1*5XQj1Bg1Y4uNU@4_`%{od_cCC|- zwaIij%-MgIIZLjTR(*-A16!kJGjB|4#kSc;tkhDNv%E^FRmpT}gte5NEJb5Z?+eA^ zVkvvNll}A*b6z7|B6En9V9wf-QcH_v#d0!TrPQiyvwE-NvShKCSX?ZD<<};)v{(kq z-(N|sQcPXywrVWDATloIWRQvwB)4wG`&OzG-PK z$DHlRN-ZbTRbkG3ryl3_)Q{!w2{C7Rh0T_u*^@+)K= zn6s~9VkOcVms%2Y=1oa!R$42?)Ogv?n6u;psTE?*Qew8*zl18&C1kp!)KXGQORXGp z_Em*g4s%9wmDJRgZcSrOU;J2pKV$j7r^s}LGF_29o%Nee#bOC8f4-OLQc_DxEhDuo z=DdH)Nv%?*Qxn|fX)M35q!tw`5sS-orM6kGZ$es=(wdT5My$eawa<<+oxaLlZz1ON zG$yrTyJn4rq}0l#mcg98k+o~qyTF{(Dlun^)I@i>0)bus(^8A?dd(wqci(<|m zib<_RY6-EVw5G)}nA7Jh=B&5iT6cMcSbqOWtwby?tqG|mvHYHtT3V*dNG&V1oYX2Y zXI?eQ?SaOe9u!EeP-;ckYwE)4+($@jsoiRSW(;$-Eos;6^C{-ck(OFUri)+at}Q8+ z7RzF8#%8u>8HZU9-lZy1|;m+J7asSzDA4%ZRC| z?ve|{5@H##3e4HwoYbnMrfzhX;>Vonio}Y=N@TiHsU@UVCbg8*%B5BzRwd@2CTkNb z7AqAi6H8&vey*@<_BBsx1vj~^C1NSDoLFMIJ6#6jy8zr76(rnRiC9W3CsvS@=`iPY zONeEpRo(1PS0EM@ONgb!GGaL~HN#y>R4j!#N0TaZ&5z|@H?b(@?5mVamlLa!>HIU@ zc?&RS$wg8t!JMT;XSuBju?*(4s@blUV9rt!Vkxn5%;{-`Sk7*>j`k|4`RBOP6^TVL zXKlq&D-|mfOJPnA%B7Z(T7}fA#MG_slKq&|zm(LXbKTbB+uYVtv66Xm9EfGaa$*Iy zyVFI*5@IQ_oS3>p<`63p%V5q{=ET&UZmmEpDprg+-zG1ST0$%(R*pIQAS1O3spX_r zB{g-IyIw!$%v&I}BB@2CRxGs=sg+7CA+<88rKDCawT#qqV(MVBC{ zEFqQ=tH7KdREhZ)yR`x=f98@}u~-S_YjzEdLsb zMX~%DQ);DR32DuURYVhOPv z=Ioc~QrAkv5@I)|@L@Xhe5i3~k&Kng=h~>o8 z3U|5!u@bR_SPomGUJvq);4ycO5;66-TPwoy=Tj`d@5Rb6=XEO=%Sda5)T+eP6Yf&{ zm@{vYSg}}%OjjzkGO?7jmP@TdEGMm1Qu9CQuB`xbwxdXDB~mMuTDe$-Se2N1%H2bL z%-N18mfu5SIhn3trQ2GJIdhaqtyF4dVkyiyV#}qL!<=;#JndQ$mS3LKQex%OS|OH` zR{tt%Uh5t`iaBd5wrke=nNqO?=B&3&YUN@XX|0f24s+fgRY}di+U;qPSg}~CSPsi? z#gnA5+U)QX;UdtbE9U2?HlsaTmJ-yyYp6vRf!dCa9c~ZxcfA$g6gZ=6#wI$s7jMT{=L*_72@BK{2SrlQvR*R zzoYoKI{#kAzcu)GH2>D*-!c4q1pkiZ-&*{8IsYEXzvKA#DE_^Ie~;$h@%&q#f3Gw( zjZ){s%`guhh9}?~=;l*uCKURWdNZKZqjc#My3-d%!jDiIX6Y~=*1#+9D}?FpK)4y! zz;MGS79)}-6)#FRORpKj7>ZN<9F}pk7P17tVtO%!dm2 z9$K_w9Kq{w06Mf*Y6MJ$kKktrv{9-%%z!!Y6ubnr+A38Cy25T4-%hD%unSCk_94uK zKnMQosc;n3g%e>kyahS<395HgY8Z@$8=(wtgJ0pAPV^g=!74DF*=NuTE`iJ8L)Zs@ zLikj^nhPhx1uzaK!)2k)vyhIgA;l%?w~oef$ne`On@6;KD-Tk;0O2xTK43)g<)_rJOo={2ke3GA=ryC z4JSZz=me+10B9fOdZ(L*98v2=yN$op2ur*KI0!wAI$L&EiRy65F5g^ z0&a$Rkb<>P^FoeYNW(ff0Ii2AH3?S2dl#`^hw<9L2Iz1x&vxN@D1$xFd^oQ)d7Y`m2HFjA?DUw z7*Fs!bRExY3jQnEhcFLz!<$zz9!lq@4_m`!O=Hz&4LvC0)^AqukZ-G z0l&g!H!&7r8>s0V4-kht;YDbaV1L2+@HjjRZ@}jeO0o`U2t8peBw#K)1mT;xH-G^! z3Z}sw@C3^>)kH+v?|k*GMbc~$EhL(QiG%CAD)kyYbv>}c-9PU7yX8FyYM zbJx|9N;_3sbyUZwUg}uYTQyJv)$!_lb%MG`6{umVP+g)LsgcYzN)@Rw%yqeHt|qG% zY-~$ardp|6RBJU$wN`dsurtm>JimbEoDtl zsi=Bhou*z;ebkHUbd^>8cxP~?dR3jJ-cV<&w^V=i0X_LxoufWigVeX`T=j!GPyI;G z4yX&%K{Z7EqK2y9=;dGZ@^5u9yJEO9dW7=p5*5^O71o!k>iRNOLyuOq^cYn~U#^bj zaBQHjP>uAJs)?SUTIy?6J3UEt)Yqxbda~-FuUCEb4eDGyRSniR@?o!O>S8@zmFNT? z^hokSf}7QNcKOx1OkJ;Ms)W8p&C;{f9DS>rt8Y{D_3dhbzKaJ(ck{U99+lSf)l$7c zE!X$*Hg};~sqa&3^dj|)zF)1=532S0A+=FItg|DxWh$p1 zRiEnR>NCAUeW@Q)-|5HI_xcI-i+)P|s#mJN^wTO}R;jRAt*RS-U&TD5YME!%(Po`G z);y=`nf0pBJghXjHovOR%x`>V?RWLH`GY(DKh<~Ukov*=r4E?C)jg(%#$LSk<4fM^vxtC`a0?7e3$F>zAN zbM;HU+w^ANJYC^?RB!P;rnmam>(_nn>g~R7^;^Cl^xM7~<{e*6v&(mcdDmCVyyrX8 zeBe9EeB?XYeC(@ja=z2dr@o8KXFjDCzrfY!JqEh^W)r`|XgE^eq>o0O< zwQE=Tv^rqhzJ1)8*mmJ1ZtG1$Tzj|yPdneYdf&c?_l&mPBsRW+AGxz@GwHLl}=PzUf?d}%8i`k?3&fnMz#fy)vB3oi!OAhtIMgOy;Cc3Yd^8CI@`6C-|@c5wtw!a z*Q;AwY1PY~W9|Li1KDQn@iYJJQoQN1DX!Y~bcx5gPqgjW{YqVI+wdp3UfFgOdwh&- z`x?3XU|fOD_qjvX-HzSTI$Bx}9HrHj_PmSlbGLkrY~|PTdUW}ncPsXEzp^(Rd%T*? z+u){JO|x6i@oP21wg=gNvu!)vtM%de z${zZG9v)8-fZQk$NcAOkT^XGHlXxILH)!p)&I1f2v^`Cq2KiB4rU#l<9 z@#n4glJngo!g`Hz_Szog7(&%0}@!_~l9@1;!V`+yU$^7`!cU~!?lpS^XAldU}5arMtf)8USx|8&X! z=@IL#W1t+T;}uUF?X6tStKgiUz4iXjBhfkTz3IH8B=HhY9PFidSF1;5ZyYaIl2;iO z&Iq`V@#a{`qpq#`Q>g~_QeNt-RDo>;ysvbov##Qf9XeX)$DnmRcSfkytACx&Yps;C z@{4k|JzQUAbI;%`#hTaIUax;%U#>XBQw+O*hwC%9&Z>>wYE9S4wrO(pvyRi4T`OXg zIY(?Gj>NO=+N8gEKV@4eqSb}AeG}Gdq-{@NSK3xh?giGIcWhiG zufoTz-8sB{--LPp^;NioV`HAZj=y-?;Iw*2m}kq`lTPc3n(mSh$*by}o4jkhb%*E7 zakySR!kxn1_Ii(B#ZxNVym`I#&X;=z-hky_RqHO&S+aVXYp6Z1cZc^KN49f4?({!?N1{rqt866-y7^V4rTVYhC2dV;@JX(|hj~ zv|jy}?dhz0v)64qxW&B}J>1%?bvR40*5R174riQOeRN zSB`o6>bIRdldsWJ;Co%taZNq=z?-_RMTwV{yx}Bi&=3Nc`)2rI_jC)pIDR)cNd7t8( zsl7X>S&UWRht`>??b{1si#4Y1?zZ^32t?>-Q;jhHZcGzOlb; zA8^HX?ojH{d&d@Vv^zHH0sfv~PxqfL`P4IbLTb-(%jZ0|x9xCeLhr2SoiV-lF5df@ z2{qiS+Tq^MRJ`UMvF{9Z&3ZrM9L3(9zV(UTQoAqSJ6G==m3Nony_@aE``QWi9M(1T z2HU(dmo+XEcJ1|d-Su9@mfvF6yix15dRsI~dg{F^-^Z2xHhbP7jkQ{6+u`Q$&M)5k zE$=;(w`6a5-a6LF8F0 z(dC>iR@ifRt={siU(tKUZvE#urph_&pO@Ez=dl@kdH+1eojk#K-JY%nXY{vi^PWev zEO+;T_paAFUwPZ%^`+uocTZl;S=1Rl-txS4{P#=t_La45yX~GHZf#@g>--&*^&V%7 zeb439tYfmup7$-zoz>pA&XeBp-0(zq>|0j|=S(<}_b$#-j^`+GEX*L{^y9(LF3^}y@Zf8Q7Hs5{(I;vM6MYxPD{Pr0K#+;nSYUmdR1 z+6P7UKKM|^%;BaRb&PHS`SHyrE6Rl_mswRFsS6&&lq z`-*%k?-CrFSmEB+y&&(2PvFSuXs>sEn!gd*_Rm}HjfK)2f93g?IlR&6ZSQ}xyz~Bp z<#~6J-f`ufdE)v9|U7lfNz6Rw8$n%UAc<@&tvi~(0eE6wR-FDYS&1gt*gP!_P#n?tG9Q(XF*TO`7|OU z;BbAmpAXqfepBA7{ipL<&jp<0{?7AUi`3C-w!OUf_PaH&&vgp4y6s=KW1GzDP3LX7 z*B7sUbLDE_ZMpYe?Ql=-c5~-;x4m9#d!6?^hr6pk+}-~_KL>e`dtm2T#=wOe#oBAy84yd=8gD$a#r^CZc{lEdS_PeorrhWce6ZMwEFUxy=3p% zt97UKv|Y2Fb2+b@cZ_>aY#zVRZ9Piv!o4}HYv?o1QusTaV{N(qI%Yl1bL{?iYZ1e7nyd_)D@LsoD zy?x&|!~L^e>+=MkviTP~+^hfpQuB_Sjq*S~k41$lq3u$~P&PlW$x@14H^dGC6? zcf#J^f4%p~hkH-_-~X-GyK}p_l~zC5TWzTBx6+V%`bVpH2T@x-R3Z7q39e5!3resOzs|6q5?hkM#% z{SC;OcfM(s7#$Fp}w|Yyl zt}f0~y2Cvu^p}T)(Dl5-?^>c1t>dW2Nhn#J_r=iX(^Y5NEI@2BQiDrYR_!P0- zXYbjj^%s+2cI|LaAiZs?DffxfrT72$=aXKa9sB3yy?uyJvoc58PTdEPt7 zPk!Z7yLPL02KLU+-Z}elXXU3kho$U!4|mP;&N<$`s>gehYWB0B$?_MNS Z4|^%r zmEGAk>nyt3u6g^)dqV2fyt_2dtox=d_PmyDv(0Pu)-goRf8MkD$M{T)^Z6I+ZfS=- z@8SMZ=xy8Kj+c$RXL8OPcX8%&>^knV9eaVTbgtsoUw$0(mbafL9Us{1weG#0&pmj( z_ui}3qko^-(=FkB#do%yz}=y9-@a?4yEf0Pzv4OfO))-S;@rP@HS0|Co4pjT_WswL zK@L+3FqZhAEYF&^`oGkyd5^MdT^NIPZF_+2ZD`wLynkzAo4e&4L{;AfMDPuBLr2atwO*v9a4NW-UW zd*kPlhELk|!OtfRpSJCb4({us*dMEjg-o;k$B8_@i z@5XnNM!l!s$KNN7`apk(e@Ghjk=}#vAq}5z{sjMoG0UqrTAAnQ%X8_+0c?_*bM+U+Zu1Z%D&urN6_!Cyn|+|A7BU8g)P)z<(l* zI;aogKa+;fRR4niN*eW>{tf?~H0lri2mU8%)FFKc|BK{o!{?AW+Ze4m`xqY?GyyVX zLS)!P$cU*<9%*WlwM{Lu$Q(tsFty2crViQO)FpeG`s8V*0omI$B>S5a$pNO29B57= z&oPb3A*LyLp*fixYEB_Xn3iOTX-&pWTk=xVo*Zd9l9!pz`%tlwOpL2~4q^YED@ zN4^=1&muYU%@BMJ$&qh{;&Vxkd@~H6M{>-Y;rN}TQFoaU_}!#Y_n0_7pEPQL8HwLZ zGAhj|{63N~Vn*ZllZ+8F7JqA0ZhjW+Glr8uh5ThJ4IS zA|E%C$tTPd@<}t5Ty3V2Tg`N)e}y#aRg=VDBaM2)%pl)3GpXz(869R8zKdjZm^t`v zlF?!2;_s7;4l@t`kYse2JMcXuqr=>Ve?l5nY3{*4C5_r^7T{H+;S=%;@y|)4_L)Wa z7bGLXEXKbg84>0|{2S7!Z_UH_cO;|0r176fMuAy^|4cFp%u@VUl2KqD#eXLm1!e{Q zC&?%DnyhGca3R^fh<(cxQz2T7x<`__^*eCx=Xd;;F6BYYdk zhCb_)=O>U{oqaFj1teEzUlwmfa&`7?#*0X<&b}>p6Oya5Z!6x6m;*b@pw; zTaZSz_Ps&2@ogvD`gV}*d^^eZzFlMo-)^#_?|rh9??dub-yX7y?-R1CuafNU+e`NH zeMX+`+eh~I?I$nxeZ^XalU)0J-{2!i#-Q&zawMPZXAJrdP#;Y)27L$du_R;A_X|Fb zWDNR#!^e}1MBg9y1k$L9zC+}-zQ4)IKFuA_^**2BudAd{Q+)yQMqh}WqM2$rZj+$ftZQ$(6p=d?WDB zNk*A3j({s(E)pFZnb z?uST5kZ%I6{1b5PpNJch5#+xH_mhku|0Fy}a((en#=|7n7ylHz8p)XQPsMAJj4A&# zycWsT$3GoEiZtqIe-f`v8g-0+2406W>RA6wye?@}J^w7cK55i({yBI9(x~J8bMc0x zQ78E4;U|)eQ2!lxBa#v7zY8xS8KM4r@FpZ9)V~04MlwSE3-RV8Bh|czx zA{njz2k|x}qt*W~-i~Cn`qOv^lF{m4f_Eah2lg)|Pxn7c_VuqI`}rRy&-6b@p5n_V=$L2l&^Lqy6j1EBx!p@%|0umHtiS1pkZVRDYJd(Z89T=HEizPiqtbs6UrsVA{lDOkkzBw0 zzu`}iT)+H(;7^f^R{tUVX_C?E{~KRTGEV*4$2j$KT2br#0rEM2h+OZFkk9+8lN<}1Ab_@(7I|YW5Jpv=ho`E>oD=?Cb21b#+1Ea|^17pdv0^`WD z1LMhofeGX}fr(^1a1D8BU=lepFqs?|m_l9=m`aWhOe3!hOeZGjPQx`M_o}6WGG*l_iaODXQdH~CiJeR4HljO-umO%4e5AqNKgl7oW%$f3cr$cuvg$zj2PzfD>#pFIFo!lIE#ED zIEQ>PIG21XIFDQzyn}o?co(@Ucn`TcxPW{%xR6{ITtq$>TuiPHK1e{=pb1u^b1)#^c#6h=nt|^=n#2q=x?%aNC!BVhPWkF^+N&jxKJp-{R7GULnwkb zBpC~#>UaUkSP0d`8gkLUr)wBqJqM7jH>2QbP6d z)+A@?Py@Uz$*2i6#M_gcu|p@~9Z5z|s1WZ=GJ--U;ay0c#f2K<-ATq#s43o)vO;a~Gf75Ps6Bo*$@mI�QX^`9q!YL8MXV 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

w`2_YDxoLN&OTGs_ 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â~!T9gu);m|DrA}p`C<+z@yk3^pDK?WG?&q{E)Z4kBU38?q{j?Kdm$=&*t>9!c zSEW=R9rX`8NJAnyZvnBI$VamG&@OVZH8SL%wAwD&jq;i!I8FtU(GNr<96 zq%mL&E~5E6Y+Igl72-%-SSDg7ee>Pr5cx++{y_24OO|DmZ+&y`q5u1>+g_dgc=`YH z`u}xbHYm`SO*a}NL;BNPOLBZ@dY~~rK0H0xXl)wtg6&p(pZ$Ggcx~%cqt$*nJU{kl z=j!m>7@q6H^I&+s8J<4~&v(M}t?+y|JbxXYzwl@8qVT*YJokj>&EdH%Jhy~r7_YZ0 zyzdCluZ8EW;raFOTw~8>`?>IZAv|C5XXokge3sd_HZA9G`wzTKjf1a&k+rS%Ys&k0 z`Px?ZUmHVKztx-8v-_>a1UMd8wYJrHsvl{=fl%YUe)y)3`1x3|^)osZkyCU|;>8m-=sV&W$;@iX-?vTP!o zXiN-D3=S?A6w4W`-j3(tYYbu{aR>A z_G`51++baXNAEk!hP4dKvc>>^#>WSc3yxIQE!1D3I z<*ggF{H+_+rE->yf?&h4-0T0Jog2HBBXbOSPUOj5X<0>~vK6#OmKo?9**oa!pog!2{ zkR*S-W?;bPc&QK|X>_S$mbF|nI#8~wwd$?6wYtu+q549N4G6LVUPJ((?H2K?<$;_A z>wLP@HZKS544!9L1A|7rtFwt=fjGO-U{fcNDlBJ>*gu_mzbY!YG;zJ@0q1&+Co=;Uf;NEr!Or2{PBW?{YiFFNieRFuI zHS?p^%uiY~KWokWTWjVQ$iYn}%r4DFrZ zqQ>wT>$8MYh}{8!KQTO{Zg$bl#v*3PX_o1<)&3Pt?*j7H>>h*MpJQRURYOaM5~JkqL(W|ktTJ)E%I0$~j6!nxv{t!uuSCm$9)c2~-MM$*f;A06YYUKb z+5oKHxpyQRl!9vZ-X0uo45-p@Ci}bD`;`R8)X;D?FxlFq=kQ>wbKm&*N-8&d@2%0B zjLs2^)j_r8NgrmGO-^1synL$Jen}c%D<1wfJBON`!%Z`5f(En)vZei!gGw9OGCZ!C zCM(e5WT~eC^;61F*Cw!@j@bLP39P3zqj6zII2asUHmW}>HM+Mn!)s8Ug^WcB+*W4; zk7n-=%4)3O&*%#MvGpGD8rRvQ_dCs1^-p-pPx zWbO3ez|>GApZHvp4Yb-nZMAZHSiqQmU=Sd|bN43o3<0He;@vk>K9s2HcR4g_} zOD}JbFFheuljYUU(tcJItoqrZVRbS&VqL4Qa5Jfg6Y@Nxh<1CEu zS!;HUmHBf7=_KZu)LINoI+7;`E*2eIw#^fZ!It;Z4D?S*bxsH-%bL723q}_VmbVct zAYX?@2UKBH+H#Yio*bVP{H@+5T+K<+=owUM=dJ-$?{~E}36;hVQ$ykipJ!X+OP4o0 zKV`PO$ph*9)Td>I5-Xi`Vt=je&jo`Fxz2Yc*EE*tp&XH-!6U*TF*T&_#FOohM=&XF zP$gT%jrRBIRbtH8%cjc(`s_ujq+aFnwmQ!Yj0;+O(^LO~Zr`LNx}B%>b61oKcgdB? zS~C}~Uo#*LA=s=J>9mTR0DH1KE^UZ2)roA{yfQ=bT7W>qfO-Ax}A(J~V4%;eB4Xu;}nw@NQzTN6P?^5phIFaXFl7;LS zMb}=na9s`;Yof&7^bKHAKNi!A?n z69oG6?FOKCfoOdqs>eKjMsRIKT59h(S!^767am#E25AfZ`rD z={hxZ!SITy$?>3q6f&BW^cdG1+h?WQq}81qco(*`C)8dcu);*pj zZ9f=E0d6*2pqq}0l1JB!YJevtF78>0jO}i+IDkvd);;5wn>d)+D%1$v0yQBAW`tFQ zr|Q9}_n-?kdV|jI5u~F5ROsKG6|_v}m(9-G2%FBov)nT~B_?Nf4lWl>N?yLL88lRf zb?^LAFZv71iDVUx(%)9+S0hqB8yhL9XP+;9{-d<`{ckm#FlDmf=s&IzF>H` z)t*sel&=3>y|>!mk})%Cu-!XqntDna_FhP}b017%^;bv)DKYcxIOb4$W&}h^ZYx4H zsz0LyrVM2+SntzR2*ha;HqgL|Y0;H+yjmc1{!=gGBbwjT5V)B+EE1G-fr0)M&p0@)&$LDd==8AG^z7&2|Z&WFpj8mk*4P0c{-@H{ewHft1KMk+y1vh?H+7(LnF z5mA%7XCo_(I%Rvc+CT6x=~WutQLWq&SEqdm!)-Qt5IWRc)i1G#NB@Nx5dm4HxQ;Im zfa>=5E*qBR^Rkv%ph$Np8UFo1g~~>!AT?e#GI$x9Rp?N!@W2SA(y(pvy?Kn%v|k<& z&nX-$QnmQuB!mk+5i)$k7_0q;QY(jtgrZjG&qB+Xyyfxc%&F$glg*hSTgb(G9=`u4r#L86-v$iVq|z38RMgn*6c6z z5AD_+YjvBg_UnR1X^nh#T$?U$!qISFVZCaHrFQIH;D03NISF{a0=Y)E#{Pe=G~1cq$?1|-Wi?M|gA zZ+GgiaVp7fe_Va86!~|zP#AB?bxiat04KFKK!%bE7ptO7qr8C&Bo+135hmRt4SrzS zvi$+X1C5bDV072X!&723B4S+u5$jeDFK^9$FgY-#2BWR^Z$oe0b=F&VU0{jsIyw~D zTY~tL(W-pF-Yq!*xIU^@mcW7E%udWD@CC!8<3dh%ok1qActqmIEN1b;_}{J>ly_~c z7qx&8?}l$osK9Kxp;6-K;veyb&vShF@UqE)QRB$j_eU_y=@bT?{q1Vuw)3A7Ji^Nc zVO1ol)q6(5Ye3QtQRX6X2$486zCu#mCOUqBJVJ4%n(%h~7 z_`<$~>kDwV1nF&&;TFhtJ17guNq@}R8 zdaK!w;8DeE)e7B60U~2XUS*j!m87x}=-utwgpfd;nv^Zqn#;5ZhFr;9?_prv!-y$k zB@+szm9p_w76$f~C6O6a?@KCn&aYAr8pV+s0c|K`)fD5`%^t*gUx z{fOk5gf^A!(K!jNSe2Mqui3Nqs6gptgIXq@?YMMsu$pri!Ogj8OHV6;t3K5WF3fuU zQ{NgP@M>rMs5wLH5en#>4hF5)wO&4Ly?lC1(xLNVt9wYIRhnIvX7|wer-z59*aDOX zj)|kT@hx`In!6~l26Ob9uts__S?UEE*b~s^0DlG}lvfXo4-cXP<0Ryb0KxbOno1Ew z187jNwt7!!NjkS`A=JavIPq(^p3H4zY76Y*QJL96nv=gn`4-}0|8%t!*xbP>QLRbh zH((@`-Q0QyMyczCG9KnZ%snAGiXMc9Fb~2qa}Od8+}Wkkdq2TcJZx@+Rr6koeux0_ zUP^w5f$7c2_h!$AnmoOX)Jg&rb4M*ekb`zB;ki6J0Vh;7jGsdTTlOP?qIw_O`XBMp zLdat-4|#aXMhl^mxja)=m=xO84>HTLeKM!1pd6lFW-06Ip-{#X$`FgofV2+C ziUMhFy%zNTyCrZnX48YQaI4Bbqcp&d6(yPP;xmqP`c`Px9{Rh_Z4{VTMSo#<2evd}r z*PD6JS&t@e&i$L!_&3E{EcTcwyl?tqvoc6NaXSVRQ{%_SUHJR*`T^Wy)(VTh124-1W9TuY1dG`_%!$t$j)4z~>S7mX=@Ax9UgH>S~<{c6U@_ZfN^(yb? zRo;zN-USp`vI5dT8GO&t;TTPNQ-^_19dJhPx(Y42-khoj>Z|z$ozod{yEY zL#;EPmMV8+k zqjlzbc~*q@y5Akg`#5u>7f26|49bpEBwcj6Osp##7JFE#nfT$En>DPaBIg}T<@@M7 zWSvqtf;_CmU^hbhz}EN!MMPE)5yI@gAvN1rvs$jZ&(V&1bbq{3rt@k=+JD@dA@reo zH0-|71Q#s1rWHanHXy-7V6Z7$)m01I+A$Y2Yyx`lUog&$T(FTayhMct z`LVcILYng+h!6SW-M3raUqOLqwzX6t#1E~i+8PyZv*In5-eP>!mCw}~b1eS{SQc_E zOEle9qWhj~Hy$3;JZ&B9vJQ5^!rlMWs>vX|Z)|vljDP)4PV6+1kLJvOP%@(qv<`%B z-A(8Q(?okTM)-OdT2YmVy6*Z>8Tzg6A4c?_g`B&8V4=<&3=Gp-SIcTw7<3(4#TUh~l12&B+#<-O(PK`*?BKP$R8cP&39?y6XW-_Mj!K?>~54 zSpY&q9~yGnK^W>43E8&H8B5Pt`m}2|Uy;+zOfjwZs z5UuF$z)pzgnhKk%_ZYoR==h}XpSQX($97jSHH1Co()yseZQ~GRNVmE>bPOT(>w!-{ zJ7qk&1Ia0#5FC;HEcB&4U>v{#91p4D7c`cg2N1FM%r@SVz)}SRrVLit^sS!Nd7=QQ zrz4;~umhUTaQT@nwuf}WM!Uh9QM=HEr(+jh*}Dj7P|)URj|8pKvPlF{XPuCrXB!tg zHrH6_`9tAVB#CgwjKQW8l9WRM=N~NLvdJrXWraxsuGkQ9DKe3<6D_K+5+ckZwXm0c z<^=(xjY&-^Bw3nX)1=YNAB5_)S|v{ikTcI}cxhP?TT?~i!QPk#v?<9Fj!ca{k4rNKU{yz`#JNRt${4{kdmp21XqM#j6GuxPbgW%l6rr3_9-S= zzL%_*;WYzto;1d2=rk^lG8D$iq#})^Z2kkwCzoTz23oNdfZSdK<)U{;#$M!=NT{F^ z&%EL*0DQI*yqm=hu6+^6Qoq_39`Fqu+oSD1>m9rv8uGM;kU%1x&wucv}h!1Vd>g7}7EfY$#!!S2fFNhWDIi;)~G? zFVOZ&dYaquUF|>NN}nW`Qkyr$4))KiLGuhxE256WN0wLmQK-bz%SgHCw4qwV!z`t^ zobe<=vyrikU}St1=!&w6wiNN2Z0VdMbwW9N5~fb}i{H`xopoc<6-Mm#2F~`|9{D;Y z93(%)-8{q7K_YbtN6r)zoSYK!Im9HLXwOM)^LxpP<*|$fqK*kGvDIWeb}&ikOm8~; zGC8@1+%rE>Jsk(;RDkxb1)a9Ahh+PSYC~= zkma!8e5r}SqK9ziBp;!A?%RfmNdBK{}>)P_}pet9C8UPnQTQuHUB7!rTPEHhq9 zC)iRYscmbP>VSIh*iGM9R|jK~DQpL2TwuNxWLxu$r*iI=B^)9|p+p!s^N!WNz(q$G z#~+-M^zwt_-&Uls{k6+z+;+3J?wQRGGlzYotp>S-!oC)5#< zJ8V9b`k0~K8J?rlGDIXmbix~RBpvo<)*q>Y9Xv?c7(FiP$Gs^7JVfP>RoO=+6-T8D zXCYFyE+6r?XX)-X`KgLUceh-^UYZydFM``Eh{Skqd{r?|^2y5Fn7T^qwklhuV|TOa z^TjnII!rKD%ow{UIv3WC)eXxoH=4Z?BLOYFPMcG>OcxUH1zNqUl?lpwSC4S2L{)>d zQl=t%Oky4@-RoEwrgK=ETG|#7FWbonTqo@q{7Nxf>+)v%yXS9)S4p_HdN;Rvx3+p) zTD@(p-i}spSF5+D)w`$F`&z5_^;YkoRlaAO*?BZ&4Jsj{ZxP?jd&vIwStSHYbKV>n z{UseEK)s{tL$3q{dM9E~pm#zFfn6%%7Q__rGUZrH&1y&2w&lpySrJ)~S=@79v3$C* zMykWCUUT$EQsHPy4(o)@fE_INPApBeV*)jXu935UR_$1A@*#h^zhfr7{zSB7|)oni=7QFqmdCPhP zx3}|N3fp$x69_WXlvCIxy-N_tu_UaAVrt_@wmQENC`Nd;a2Ac5zkqnm_=wI9jBrd( z0Vt1-&c`TL`#oFNaBxh0ISG8)azAZ7U2W;BH5gue?|mDrU5|41KCb6=X6ku8qRg${ z2Vwr5HmcT0{|O`gd2@^P7y655<~!zS&p&6GFBwEHS^CZ3mCwTw&3S^8&G{EB{Q@Vz z3sKk^iKP^iok4cbUJQN-(V7cC|4Qi1U~JC6V!eIOdi$QGW2}3An`QpUGGDdyt8(wO zg!u@))5Y<6r^86<8W3N$HZNQH2XPKJTILV1ZRXpp-bp_`1$aZgffaz2Bv?m$P{Ke= zJUbO9F?6|(D_9+K1%C<2VoOWk>!|ST<*KR?)Ht{Q=-c)j=U=z6UpIiBwX_@c^I_Y> zo@Pi{YFbBb=I15JT|`K1iR(wJopN{>h)0Q33Y|eia z$6jw^eB@*NF^s{JF*f=byn2NXLIs{)W+?;k_o0lZmyxnNBlEvjN|rhICHY@^d%b=|hW~^m>TG70dP0lLa32yeJhRIbk{;?>Z@L<*82HRC{p0M=S-JkIC{0*sF~A|fnO%lq zfE%$E5ytCf3FJN+D`lJ7HU}H|Yhj45wPs@SNNeUu1nh`Sc;|XmQ zoyGbUk(ru0yT+QV@lIR4Q?@(N`!L@#?wvBja^|~Q6o*cgNT?^(W>niY(qGa>gZfKa zzBCMp{L_nNecIBW_BG;EhUIRw+>MsrV(BfGzSYvVTG|xj*_$nWz2#qTX``I8H|hdV z>+GH>UGJGud=8l!C9r7XSvzCkB3Pk$%g$#V|Yb56Q49?WK$dCqqpPRSZO@Bz-_k#@2X1N1#js~W ziz6N?N-DAo)cI$00{=@o(lU9r-Dt`d#YtyAvXF`R)vsG^Q^22 zD5cds$>?WKTjmp%e!|jiOSdgOW9b<=HUw)8$6^oBVl)KX38p-Sxwq?zvT?Nv3IsD@5b$LFl{L z(Q%|dOLB|LJmNjNabSRp;cLRJUW=KBtL0iF)z+DA+7W=$iB0V|OG((JbX!7{fL|Nd z3CKatfzRNy!^M_ZuG8?X&iDQL!}k?vB4V?NYQK%uNGL-WeH>Xh**X(SXpMjqA|6?& zNnmTb-9cRup5hI~7>C^z$|DulVW^acC+L;NF+5SKWDHU08ZdFYKgGSZG;rx941nWZ zs3E@#7Nsv)8-)U!jpfrh9zRdKZ9Qkdu4jUOR&SyE9Na>lMN_oHnOCAGym>{@g(!;; z*#;<^L~J@cVjd1*5#1NW%T}Dg0$H7ZmH!@&_Ol`Q2`;XhC2>69PXCj~OUj!uKQy zo0I^t$*c;KS`(fZFoi%R;{&5Qi>&Rz72|g5U6;Zg1J{S=jp2E-o~;7PxNs)k3Bhs= zZS<1KAO_R+CXtcWRQpmn;rQ^)vp=%F{RuDVR=0`>ky?=%IcI+oD)F>Rx8{||@=8Ro z#bRf9dIz4vwQRv{81&5(N0Q-XN8bG3LUW!r#x9Bs5VCxXUxZ3Lz07mCvMgRSgi1BF z--CemC<`I$Z};f!2E_@45Z$+tX=rlApC4i>+Pjx3$qtcKw1e^3-Pp3^hs2*q=-^=N zM%Q;H!ZrQaQqNx@)2NwRJ>Z+V8RA&|5<@F z7x;Rh3H*&ry=i7c!kn&k!|oG&w}s6ti>wM0Vnyv1bk<3buS43eP!%E9G(p}5Ya))2 zXR0G>uU0k=&p&y`p2%AXlDw4`*Te##+%&vuWI|_@!0$vFq0bz=YpQ5Qcqe`d-Dfm` zW@1iuza5yuE%=GSR-DP{{66|$73b0?8(>p*m}J~mwx=e^NH)oVygLC`XeY%`xC5_a z=@S9{7aBj!BFrWg_wvbWLJ&Y30?@JbR_C?m>|G)+&GfZkTyZ4d$*94tql*>c6MnKu2Na?Z?&Lt(P%}!7nOqdUOe98*f_!EvzDNPMNK3JG z-hN&cN-fBkR0~lq8^Rz*NgLF%Y*ejLRwiX~t`{k{+P~(8whSO06w3J;>n*>qZG9OB z>DuK`9NaUSvri9aI>D^}T`B}KZ|lY$OuK~VXO$7#+jPmuk;ltAb<*m-Vq0B+6A~X< zBJV5g1l(+lAfpV+Jb$@x4T@UWjbHY#7nwYssp`aCy+=|$2%(mkZq7azWy^DyX*D%# zEAywMP-iFyMNwCUr1_`q6xFiQDA|T`Nu(CDFN_$&Q!z-c7q$+M`NFM}6wtpg3{N^z zR&8XjQd;40whc95H9(p~NvlNYCc?8W!LzP8%PosAprCt6dosGjFrH^3JYT~6ZoiZt zc+~ALwcv`45*D`T?){vENvm^_qWp^XbobgxK+#|ideS6%AIo9zVY+)gtGie83c&Rg zDgy7SmyfI_bEf==AMXv*Az>YQLM^&`^A_E`YH=-!qjQn+`(UyU1jyg+{waCVc|VGu z&#lVe=ylafSyWNn-3oPfHp+>$?j*Gpcd{3$%Jd>#=`R}%;`m~dHb=EXP#SldL}+J9 zt^FIxSK&8iPMJ-qrL_z$Po-iVw6j%@b!nNv;4O#aYKi00yDmAzfj5>$)Ekr(`n0mV zPkYPz+*s*zqx!65U9DRbl`PeoUaxi1?Z-eB+@LkcxiTPLgy6-TiWKWyC9rT2QaSec zQ)3*nkc#8Yxlh|s0#(sTP4(jXkUJ&bk)%RMsj7DF8{@dit+Q`o=Y&0C**SS!bCM5P zS&_un>|S<^I%B$2Ca<^s^H%2usie89MGF>gRWM~>`6xS}AM-H=8E*QxkSZys<0lc$ zzDr#hnLM!)t+88zWa)sbu2&h8ucMV8Ejs(_(2A#5_MFz-Msj2}HqZVx)ZuA8TanqH zWO=0zLM5Kw5h?Sh|EM*W!J)Y-8rHE*hqHfN6HI)a^*6k;={t9;ngp9Y&zH^a6_n#P zdtT%tyW`b7%hSN47YD(MT60^JL;u?-u{nKgInA>?t&tVkoV=(tw}Z-Rv?uqa=5|?< z%#aeE73gYp*#h$f>fETKHTQLOu))-n8t`KDk?SgZbJ-E4uhwtwAyq7DEz6Jz(Cj{` z%P<@}crsd#k{`KDl@Pa@#@L<1e{0f78=N2OpO2J8q`gC}A6f`Fmq18D!ifq}hYhUW z`_2`*L14Ar92$sRF`)W;hMSU7yEK2{9aQMBWascgqZa1tP<5Rh)vncjL|mxNTm6-$ z)CCs=p=h<+acT7iHc?oPhyw9LATAqzBI1L|h8}3_E5y9IwlUm2Y`MNm*X`uZ(21cL zc#x7~X_4f!8O-79@7X7@d~wE&b6?4@F=<0# z_dp3JRKaMI2EiVrsz8Sq++rj{UpT|<7Qh^=oM`x(5gira_V|+yRruQJyOhq12FB_D zzXrD9{NTWw>dd8+eWX%kceSY^fCp*;50BY+3&8$_$_;i{FCUV|#UZH`2Kttg8t88@ z5<9zek}0R!D6y55+d-h`v|8l!Z|hBtof(1Zf1;16yb-NEt4yPItr0n?kuLtEMii|x zi)@!>YZ?w2W@+guPe)r>x2u?`=`%0Uw1xjrjhEonYCK@l1XsR>6@UiOJColPV<|(XsCsh4W&QG`=@aH z*g{NisZ1Ssw(oIR{g%{v_uDE+)zFRKj0Z<_#f)*5tura{wN~e}biA*CJvG_(dpY?B z6t{Kk!DN#sgkpUrE=nX-pL;2o{&O!m9*;y@GMbTkRy#E#5rO9kb=tW)?^M<2US2h= zEwXi-7ZGd55neVgb)9lXr-$r%nJU;6ZO`bNt8@UL12DEFx=J4J`VnoDj*jTNGWudA zpNS<){Z1IeJs}f|c!Abe|C)R^vl+jMFw&gOhyB4S_DF3pRBzI#CAKy6Vdu%5Q(=^s z-RC3BZ$>>P>+VhSYCBITH1BBdoN(NBPN;1_c*nl71#T<>ZcZfJoM_JdNGFXni6@k= z%Lbj3{x9~KU?~jz6CLAJwb9#f&N@#B(u2CE>*y%X!0{p4WYaztmr*yV4u%R{{|x%> z9E{Wbnco)h-3sr)KbJv_9$F4(L-|PD$ff$K14|Oea!nQAMj0hQp(|Eu?ERH%4QL{Z zfcw{}k17$gu*Axf!=0VQLeQOloz*eaIQcW{)zf~U!zfQg=qgYeh}E~ppBf_(H6zWr ze{)9DLLC(Htuw`ot+t*y?MaJk0`d;0`S8TsqR8L0Hld~MyAMtk%5ykE;!o6yRH0;Z z?iXvt!$9mMCPNR81>oUrY%TbJ1JTtxNo~;Jf%+e$1ouYUS7vS2pKE5Q^b=CEM46hXv(CL)sp{UFY`tOx6 zg;!JrT5RGGJ$j0SO+Z-@?X1ias41K73$c%!^hyJ-TBCC4>m@w}+}!&rF1-1-SFAwi zWFQN9&pJ_P2|ouj_dar2*=j7SU$hWYM9SvgPm!{@_nT){xe!-=JPoHB98c0Cz`{C8 zk_mihd+vQDLZi+L;Y=xIrizPY)=lSy^0_FM{DpKb%3gE!5sICCJOPT%tn&5!ks(#g zZ!*aO z>zo`zKf0w`&zhE6=93lN5f_2zcB-z#D&#Rjgrd7vANUcspvOl?M|KRaRQ&V;E#MCW zpfmcYn9W+$X3|N@k|#3?(yH(hr#FKL$E5m~yqmCQ-M9U0|Jy8>R<&yhQKu!Kxfw}k z6Cs|kaU+sd*gUhPh@hE~B7*!aB1lj~ehu)d@t2Sdl_}bM1%V^CIC)2YF$a-h1YSat zE~v7$rHb|5E{xz5>*;#y-w$(Oc2c)aM_b+BSv!9U+4ipUTdnRhp@1g^&*U_yuR9w^ zs;oYmvnR3RVotzj_je?O&F=4VY<7RwJhO{^!|w0whz6erZOuNJAHVEA6MIo23>tfR zCiU`+dQlWhww{10*pO#9V`Y}}heY>V-J3^rQ2oOI22ZB(p)e}#E@H5Q@=xi6Tmb#U zIH)B6{lhfqhs`smuQYPiXQw~ZcAsv+8c+7=o(>5Wd>GlYUFxU(8N8(~{S@3(2d@}^ zE<&7lpbBS_w(bh78GUks?(*e{qt081*~h5|>-)f+52C=(nQ!H943gd`d%9HiwDyp6 zg8O1Vb=T9OoXcCib!(eFAs7sk&pOZi3x{ZXc6ht=1#43}Z@3Ncro!-)V04qVM(k`&=68X|VF5^p1dow0SCx2?9; z$-cCEWl+DOF~X?NDXEq(FJaVIRcE!|4y6@Ak{7NN{i(UX*8$H7sRaJ_)Y=UR#+Kwv zdtqlN!yqnnT3(a>UB0enE~fz^##+vhP3%XO!Q|vx$1_v)P7E=5-8Yqgk&o=yh;}jP z%WM5ewe%w#BSX5C*4t!%x9T$vx@y0v)!S-&sl83wOVzzxwR=tfxNG9Got(t{4>#;& zQuMY`5gXNR)A`rN<&}Gtu%-^nx!3e(0_}io}6!aD-g0i`>rGqd= z*`Y;A(lczRBMgAHh05t zpR*Ek_KFtv>uuKz5CnP(y4>*hs1{y;-Fq?vN5`~#M_WByWXajyQR|X zRx6h}y`y$z#-yyeB8EkeCvq|iB5CLX07 zaxv+KmnsH`aI12sOx2q67pQCOhfeU`LPCHREB;0mA>mf<_qOR0l!kiMH4?=ndha;{ zNbnsN&7sqzQS-3K{G@q&y+5jPJYoVw?(xlQpNK;^Ugx9!b+{E}w;I2Bfj%vw75t{` zt#4lB=d-k2mb7TLB0e(K+V6#L%juBbH!tAw^(M~ik>ta2mekaH|EP(M<)?6UOHP=^ z>gRZuj--yX=C=e4&EK47?TA_1@~m59){SN7Q9G=OhNLIUrSez{rFN~PHGeRg)@=sI zlOR!UXxBw@pVV%NwB}EQhP@|R^E+s02{g|9X#t9h()&Qal@L;``CF~h2TBNo^D`p+ z=&9O^5tVWO!k((Gca%L<%P4uOma_w6VP+YYLh|W&5mZGtum4U>v55$$?j71Uztnl+ zt&f}YPjiTrLFaE2JvfUHK7?DuC51?0-b{J(ga}~4`DY{0wW}KypmmqR!V_>!9;PVF zlkz@5+cl+1)MDNbKg{2(;7DNV(>cTnhvt%{b2>;CPcZc9d>Wn8y4GYOO0(DK^EZ26 z_SDqrUV#Ba!~D%8)PDZvy#4&m&3O-&+LD1lqQzE=!}N4QBq691|sMc;+nk}*Yt!? z(o1noiRJlMBT6Nv=eLC^^8_E;3i#L-@v$x8V_S3ndpBTuvm`pV@oS+lVl8w5N?X0( z7AVI;`{rLywxCQ-cllnA>|OR(1U>6{H^&>T$8xB zj>zQ6K^~EKkeidg^J?1%UN?-DrX*0*MU!JWkrT-sCw9WF zWrdU|S$1hxifBhp=tPm^MA>Rr8gWJ@YraYjWvQ#}&Pz6F#DHD6fC4ChgDS1uRd$_) z3pjw%b-E7VEMhKmxdcy4}zB+l`ptcwd+s^s zo_p>))P-xol~s3*8<=ntuGQ_6VK&B6`xM@7i0$x$W=}0YXs+=kL<{yrT=2r1WY$nV zBoA{{3-FJ)S|X~L@5L$CSr3{7VKVuncqX{kAQy72-h2 zaqujmGHNlF{%B$H^Z$FuoSoS zD{k$He{0ZmS|`LTp^a+Ml4@$?)?1C-aux&J8VTIu{Jz@Kh~w5sJ-0?`xi!+jt&w_e zjRbDRRWfeHzJyzQtl90U;}*Ue$uwWw?DjNp3nlwj9k=QgFmW~9vSMOx?Xmgqss)YQG;$`pO2zYBxdH zL9p;4o~C7R3uPK)!In^JX9NY&LO-nmO0~a+j#lkzpOuoX_Q3~1_!aQIwO;KLk71H? zK%{D4ygJ_(Td@LR*>-7Nv)V6MM$I~^TEQEP*0IyiZf=N&bamwZC`?Vb^g3heP0x>n z7fTb>K^qlSPhs8FjGP#CF~;J33YVNCix~MY+{=p_pjWg};bJn~zSyCf)7R;Sh>)f0 zelw1Xtl}HW@gBe!Rpf_}kY!eXEMhVjzSwgcOOTaG=DvO5J@*=>q&-WrRw;k>f*kCdWH~vM+|j!@7+?(Y{$72i8Wc&$=yR2pC7NnIl(98e z%^0}2`uf(OxwE#GJG&`QDLs!tVG=18P)zh}+!R~^1VH0i5 zrnBbdT)m~L;rDs_Ki;gcI7Uy@on9PENO+-l@q{32jqAJ|mTl{8 zwP6v-+AKVH1U4Ehosx%`df9#c6%tW1d^9z)GxRlGgJQ5>m>6w3X*$ z1OU8v%9hV5u6f6JTq<#K9xU|5Vko8fr5IP6FS!paakzr&1jq-ibjXCV>Z*|xfoLTY z>nbqu3FYd2Fw~#oGPu^=`9Z#SgEGBf*byCX=Tbi>k9Ee0$FCbD+qqm+tiiq49T&UP zW(iO4l*}Z@6p%RR#U9(Y33qeiK8c~|v9k^$XiSCKNiuH7QhoLsL`z=Z(Zxz!3VZRV zNdYxES{87LFR=g@k_da(Yp{tRX3fN3y>e$yx+{L9|C8P8s03 z!GMm!vDu`y!=;N`R3EKb{Pc5!mY(%t*RHIQ7(rb7iUm``_bWg5R7Shoy0keyVH~u* zl&<&GmmQmw8*o*TA5o-Fx(DZSNwqcNx1?;IW98m-&x_V4zNn2}VO`exJ-V9mi)yQ! zdGjeL7KW&|DYFUAdK>3Z)m}{M^CJ7mFM~@as9Y)m2haE4;xbRajW-u^sPhd0*>hNv)kSmCBST zTF)AH;!%?k8 zlFNKFAzK`yEZdZFV=@2RPYj=U+MCK0VQnMyk9Gqikf??`$vSmw`F1c*lf@LUQ4%x2q)Sl>J2l_4Qit}F$Nw0>a z*Br`vYnOywA^1`U7m2KfY<6yq@)W({H*Z@bN>&c4rE%dFw=COl^VgpEQxdU)Fukh4*B3U9iR49Y6gKcl`ak5B&94JKlJ8`yV~_%kTU}$NwI=Z_TV3ejfs%|&ClvV;|IO-HlQIIfe?VbbIYpX0kZIvx!~|40D+ zQG3K+drF@+eOMQb+7;N&ViG&B^|?)-4t==rCTj20XN^8x`mEKbTc6wY>CvZ`&q#CK zLM>HeSI1dur&{Kt2cSWonii<*G5(EGPldaB4&Mwgk!6nm#sNA7z!|_z^WQNKgy8!fZFmqru2P)H4S}-KgB0?>cC8Q>yt3xKV1+g~|I$5}N z7-rYj($Tdu55Z?B;bhbip!BHx31e^0u;>yDRZ1M{lGrJ!YTGqOQc+G6?G`Og;Fz~! zd&EfvscmKfmv)SG!A@l0$2<&>CwdM%by1?qj8#yTSubza^3+FsMh#^W3@3;I3D9P~g1Z?DCqSv7Ezo^pMa6PB;mE^wy}~*gY)U#G7$RvOByS z6C~XZn|-&2&C;w=Qxz#4$bLsSWntN^y zRHIBKEcmy#21xDODOlIO)hCUbTuUuVWl6?eb=#*=b*3Jt(1))7L+?rJ%^>5dUM}hq zrPYJU(>;#!IAD}G7v1Z0>>L5=X@W+60FB~omhI7C^r=Q8;DMSxK)P`t>Nqg+)NXVj zj$H@#%fW+vyr+q3Z2wfWqP>0h{sRN;_u=nr1|~)(9oPNTauiI+%&;O#PY^4uIAL~` zbWr;WtQd9c_Q#b~QB?fS=2Y?d{U_%N`N_@u^P}^#ExPz$9!} zp)fmsbiR<^l$pvG<_g)VTy{3MDf6}btg<|^W%I!1{>}ZHGP~y|3iGr1N2c=gh1u-H zrp(^?qZ8w!U&^06F#Sw^>XFgW2agVHJ$7s~wxA65_4$rI-__?e=G|=`uK0bMDq-`kf`1eT|F~_{YC=lA`aIy%bjULR z$dMJRddKjT`|wQg?;!sU@$U%#azs?B`kaxSt7`;_?ma~a&l&rWVi9lk6+WeRIbU2n zqt97=URAm`6rq`zG&iXe#v8g}x`zjD^_~Yey>REwxi+PKM{#z2;OR^F%WL(yQ!(fK z(;v9>0&}{gDip8kb3LxBb1~vAen>?5o`7TdKI$#}JGJ|d>(j_}F+`sJNNIWAIbG_~ z@o~FU`w@3NFoD%}#jNAuXM12!V^0BLSW0le6|EumCM7+ukFMvjVK=w$dRNJ)rJ;D` zgtEO6SM#|(QC9n6+TybPi*h8a{7R{z`9|BkSQ?A-mA_@MnSU*bK_&5|@&QyYy`+!W zQ9TnEe;$`VvZ2K1tO82+N;CW6;&o+w?2iz!_YdWv5uV7i-__tI4Ti{vh!1hX!I zxnyCN?R&+(SKC&tQIgjbZPgG^i~Kvr5>HSf1ctL7sPolkUc4l1A9^ER=%(N~yc7@_)@x|9yr1TwVz<4=5?AJ(Wa6 z@%u5^{Xz^MGz1%|q3vs3kH3^KM{v`o{z8t4= z#9AA-gYuZFP?5}4?hUCb60XuW6n2p8l?jW0_Z4HiXi-^E#5eUp0MeDSO5(27mP<7+ zzU0}8Xm^KNhkLMe z<0>B-`-&In}mG+MsCcH0dw>K#Q{q` z#QnuH`kdA0ygsk%b50*|a`8>4!nuD^7`*G%&I+mB>NOD@wz81%BrTF3UFYv>g3|5| zsaN-3RPY?MJdfOv&%mKG|i+ilZDfeCw-c_r%ywk^l4M`+81(A4eRtJ1RjIUQ{M z;_2%>F4)nU7n8di13DW6+EjT7J+}%u^0}UHJ;glN9_UeiN-ojXTy94GserUiZ9+4Kx zI-?K}gP%Jn$U~u^%5{Yu(#OQ#^-EUc7egBB=}Ky%CQeQryeu%%iWX)Kuk>qyF~uu( zmd4tAh3Nvm<)22Qj!eV4v&U*~Y60O`vgaXly`FtMVyaS3_@1WY?)nT6qwXMj$nTh@ zKFa#GF~Rsdp>|$$f=%6_X2o-H1qvaoR8Z2_J9+NMBbL_7KlMeyzJ?Ibf({RmwHp;H zty5A9a#WJ{xvTob0$e&TZ2X#mVtx_V{?$M~ot_M#oSO`?lN_83ksO#zoYD-|uIvnP zt!Lieyov9Uw?mRiJd4!Ank$FN9(GSU14V4*kZ??@3vtcNr55nq2g>|vkk^`u{Ynv% z4iizA@cEv&T-MPq#-58FiMPn}{Q9^~S7HrVx|%pI2VL1^=bt1}PMgMjE=lE;t_7rA zBU0G&*3Nz@*UnH1Cm8Q=a$;-&7EP`yRaIUmR!LQs-xGDTWzxr51TD4vp3=P+=)&nr zSKp9Mu|E^|ut-`H@%)HlH|X(_m`E<-ZjWHH7C+2$EENSrO0wG%k8U-PrS&V*ds6i^-eo(fT6Qa&ZMo`oJhC0RPI^;p>Y0MOJ>MXalgD{)4j zK6yV9Kz{;50Nu$6#eB%8RFvxkpM|}lWZvos&dQ0{$&rT8AH)YN#C8@K9Z433LN0b5 zHY8=AVO`QaanhZQNq06R-4Pmi>AaJ+>MJ3$-h2>P+9B^d)Hh@IB!pr^qjjbpiED=% zmFtFBNaHNOhBVws;7dt1;@0J=obu*N9pqDSu6Vy>91?GH7U6g3b0Bcid1d>%zE4_m z;b8DC49PnzFKxyRyB6Zkh@&n(Vqr(fVJ7;*Scq^!C)r-uBTyr8gamvc?!#Q{2{Qs; zgv0Jk%}&+3W^XiJ-*#ye4)Y@oS%&Mg4Ap0`>dZ7`8L7{*r#_3J{kFoWMUBE(_-UxJ zyQxQYtf~nt#4V854y?MiL64Z~DSgxg%ywSnZVrQLHfc4cjO^^P-cYiReNhN3N;@sa zO@^EDy~NWa_#IY3G`Sgmy^|lKV%=T$0&*};ct+}I@kr2LIxhBd@Yv1r!Bf>0@}#Z2 zs0`wnGt1@!1(7|VM zOs>9_wmj9D(&|E_&zh7DJ8BLsin>yo3G<$ihVXXwoUL4KH>_)^pY%Ei$lQ{BzhmF; z+V?fLnUJw&@%!w}Nf-ZIFE2Cq$;Qor5n^d%Z4QXX@4fjs4r^kBOG&J1hd)(I@6 zhvQHyx753#KSiv)6^PYC4sGY9kF0R=b+|EdZ*Al!lAM@`b@}R}>T<1OcSLuGd&T(y zQLHqeeH0@rMTU{CaIN%kcX|^Gtm*1mearprd{0=w%o?6BE)DX4R=RX=Pe`wOJ3)M~ zE`V8=!Oo~nDT(X9-6xixsD52>Q`)90wB)$P|4D9qWT_7z&$V;}Y4_TTZjMgn10Rpt zJ$dWHIiH;_PjuVQO!sDocznN_vk&cCBmtwf0Fk8o)pz?&Y7f0Ty>?m!nuF_?x?Pmn(!oN zT`5bZNYd)fVKCB*IF7!0e65t}pC zBi5C66_2@5+sHo|B5cx`$+l2cps3kY*rU>}7xB`SF5-;5HD1w>tzU}dk34=Oh-K{| zI32A`S9*M?`&rl11~Qzw^$o=Gtq~sU91P369$}_YlhE2sp?tFd4GDc!QcTs8TqUdwW&Sd#&R1wwmbCLuHkF-MF&5`{AB8R4DH& zs%ggrGMY;|oRU_f7u|K+mxW0TQZB1+jLI5Eqp$6fusFcd8xl@8Kj^rxchIDMjdgKh z63|+4tI3Ddu>Hpx?#<*2?Y#!VmwMPp{ttn$1g!d6(Ch-*s{c*b;)eN_D7n5Cw*X-Y zSih0*f_|g9A6+88u2bCL^oDrp^2bsnp{dcd#djU>^xzVqd((ql`_vv-6H+#Xk?vzP z1?~t5)BVlCq)qqt7}T9$M^YNe4q7aOZP9IU@vGS5TuaE(hx!#C=skSO7T{orEL*Ip1W&=bhx=< z&CzxBlFBRl5iPUI=F|MLg}?6D$P>{Df1U6PpYB=VZaum?7#L12v20Dr@nn44rk-}h zNc;@OMw~|aiHyAVAfBzccz;2zm4A+ zd(Qt3erHGOUE6f|r}$;9BtCV))?*H)EB!9hrMS0p{wobY<##~ic;CClevg#(rB@^d zR=P5(mWeOHMR5U_@)dC537K^Hs;_eSih;UD$R_tzTT{mu2S{KLBVIhZJLOm&J>HvQ!-*0G;wWpgm7ELfM3kL+U z#u!_T|Dd;&zpF7iU1DFiVkp!yvP45J3%<&Eo7Eb#Om?qMk4V>;YfpNl)4RJh@bSS+ z0*>4jt#)b3{pk~u3cnPc9$}k&98>5dimWvd_a+ec)f{1YgJoZ8{S;!oB_ zE-GE^Vc-k4dK7`a7&LKVkNW7+w~02=|B>FHPM5x|UF_!imRud&*u*gQ+eE_7e%?~t z(1mDL*W+3T>J$q7c%f81JJd(7I%1-nNZaQ0l@B5=^gKkF(5wSY{4|t$yz07-MgI1? zng&WRH%u99K05ltc%P&;>IAw4iVTL71L%q(gz70`om$L&n(p8ZaRbGQ(QiZ!W2X&F zD=4j+J|0eba&*G$0WT_&L{d|CqYYC7U;S*Ri@Vq)gYhdl{&Hd05;;ks7|mgDV~w_}i@FoO_mmSub|+EnDVvVsDOa*kfC&BymDDwY#cu`=f>Zeg5xVVJiExr! zk00Wa=oi1~f~?iZy_$j)RCz1&5m(ln-FjObs^*JPbijC_s zx2c8Jx6!qdQ=K*w5k3s0$H`Ubr1rdKlN+$o#b5aO*!zg3L4veN>4)j^eM~~C6Tw!n zJUpCQJa-#)uv1#m3hCX>PN--K*b43ZBnmiPydLy}kQN>7+Um|oFUVXMm0T?@1`#3b zyt(15+}&a$Ec(c?pfh+m?Pc2K5eVNyiXNjW?Effmwfu--@7YUnA6Zi?Kgkw7m4Kow zKf*R9k+xDbG%8i`jF!a2%G>PM>*5AUFP9s+-`jPgv?Z~796==#70N45{+CdQVhQw$ zwRTK(uQtBR1v-!?UE1WHG3|5oWBY&)$6zo*!b6Egsow}rdTUz!G51QFf)jAioTP*9 zr{7v=sn6%Bp0`?6&kH~`a-Jw;PFFtkf`)KZ65%Knli(7XP9#u@6G?F8gd?RMOfjgX zq4+{qT_W~&y7CURpb0w4=w`jQW%7ya3+(%PTUxV34{K!pSifdgt&ihz5Bi?U+bF#8 zJNv!if)*Ze!GzW(_M!AOY1W=kq!f8L=wh%0V2@T-WA<>3nU+;mV>&gq zgsKsDNSDf_>r3m7UWAy71u^j4Z}HqZX)+b3xs1|Sx-^q6zH?VtLZNxG)SxyokJ&-? zI7SZ_)Wsm!RxyD0laO0QW3LEElcuKMPI0_5M+&xr1-ulS&WOWyYEx+t{x-y3pu!S~ z@!gP>Tv5{x0MD8cm%XWxzirTTRY@T&P*PbV0a!me@sLJu+8n!QCTO%_dt;8iDh3`*9&<^#xrJ`6U6Oh z^T8HnS4+ACG$mUDUDz6`R%D=b)Kzb2moDCBT|w!h(9y%)=p^?8yjSSV~;eYaJ)Oyv}HU!N3kJlWcQwP{V&dxQf^-PLY#p=M0*gMo} zc@mNH`Y~8+6&FUyaiA(ohu@Pfx0@Jsw8KjDlNLOU)U10-y!y?<@+Y1XX4IdMvtUlX zBzf2DDh<&UGi+ghWstgVSARyM;B%T*+3|7zwwtwPmNI^%Kz1~3SSp-MD8TZ2z9;-^ z-0$nTM5ZKvo<^tNhDoBv0mHe270uKq1B^lDX)UG{7qKsKXwZp=5o@=NKRZ5|VFzE` z*vbkLBpD6q^4~BnG6(wkZ(^-b?u%P^xz7>B|NNSQoO;rD>f@%U(N*#=c@h)}l941z zYw9Eo{~Ho@!9EL8ylKwj_cgbX0oBY{M)-EeLibbN5vxls zLI+CRJpmKdUH)6N&E39#fg4yt5I!c6nyJKF16?yIY{(lPcm^-3CA;j`-Rt9P=HoEn z16+-S-T5{YD(_qwAvD8QCxm7g_9>2kbVw9Skmvk?g!l(6`AE7PJBEc)S%X@jjX8#l z+}^Lb6A;qU(+HDlO0zfQ!ZCbjzqGbr1;^oL8GWc*&?eMPaQaZUXicb_2F3Of1g-M& zqv=H-a@~b!iqUEkYC)-P4gO%a;d3zHgM-Z&)EQ)%u9X=;9{0GqYznUIPC40$`b)0aj`rhq8kk-91Raz@Qi|8 zIVVCn&RYy#_{ZXTr|m_tRlN0%A|eIzx@*A^`rpCyn(02fYaK52mS0KxX3ljOF3BBH z&YjO%M!?H%$n5mum83wrY504EF|cSa-E)QP)-tZSmJxdJ zwT`a37!CmfPi#B{%Z2JP8A2V6mEw})UCX$4OiL`K($v|p9qb1U?7XP#{{o} zq1SG(WHw{w*_@W@WU98iyC<`j=3etB0c1g*1lB4{6{xSXBo?_YiIj`pAYL@T-E<%_ zK)0e5a`l#`$C&Tp`6#|?yVu&>R~u-vcn(yNOZEv;`vj#}4z}(&0B-K8L$}GLE1S^P z*4Mf=RN18BV+K?hWLhF4cBNmGFMY#2%;)2&9CR@UHMz^6$j$L~-==$1(v=~8`7(v0 z-veZ2`GSt11d19!`2_>>Gb76Dk`_l)h#AMm0y3h6b>oT3dxGYYRn$RIvTfXyVP!(t za45-lC*01?BgMXLrp*_35tTwbf(fR+g1o8EwZy7j!B=F)Dl)Tir3387CnhQjcf$To zFyO>fFlwnCxe2iEOTsB#dBu{SO-TDn+^Mr=!gcE9J-$<4OBFS|V*m`6_rM`WYD;wO zj%mf0)Gisd^&mJlBVk9WtlaWfCCkKh-yYGKGve`JU;s-Y*5$=X zu36SA%386uUAab^AnP@z=VE^GP_Ravnh+4bVq&NbrYqxEU>e_=Pf2w*pjqK6%vVt1 zA6PN(7#lRGaREhXQVf9wX7^BtZ}`UWA=4dF6*VC)hU?s`(LH8M$7w^1&wGLt$q1?H z?1k7~DOELT5sN05c~{YVIsTS)|x|xY_lL_WE8!L`;Lh&<)>JKG3 ztdR)s>N>MP7Sh#zM*MWdIMTyy>c!mp2n#PtUi_J9YkDp^c&cEj3{F3Nw%Vh5Y@6Ln zm(OoZS2K=#)eY*ws+)j`{P{ZdrLiA1N94Y3P4h(c(QD|AEvE_yb4JW24RgHLW|*vO zyxnc9p}30YBq_zR-(*;*h|_YjtX0kQ3LkckCFOtImYHI7Toh|Ofif9Ci0fRd0Zpod zzDj)_ziT@(uFvFvB! z^3a-02b*m>7_F{Z<2K$hV#WyTtsc=(wR#9grzQj3U>Pms=K?xAdx-UEb5^S{k*s!4?UTHF?AiJlB+tg6CoEN20gM%9PX=d=!)e}%!bB3lJE2o{0 z`Qju-uq%t9BR)y%3~CGs)9j$1EG)mAE-%U(1@#S-(w#Pm#8jfL)La|cv|{;X-C{c4 z8%a|E!xYVBLab-Q;Kk%H$hXHS$}iJ3kAK`uEz`?!x1oVxk6Au0Tc`*?C#dP`a)>x_P8;kE_ z1P9tO)D3EoUH{}s`(C00K#md^v_@`{g14>helm0=Tv+PH#Pe~SDRx%uA`F&YM!Tkd-MH|Dgq!@1xZ2mEwkL z4`kr2U=*(z&>WD(!(5llap$33c@F?U;VFLD{K32pHSB1|Xa|4U(jdO6Hzp5{rHh;> zdx;1R%gtjpXdBw~g|scba7Y6ap3wrVWKLd9(UtOIm_ydZl#VZ4glUr!G=xsNlFrWF z@^@UZjAcOVTR@`Qapz1ykOodoyq{W|($I_(;c>c87;oy1l-6Wvlb#_9OQ$yXEm7BW zw!iz?d=3RI1?wS8OV10NB96wkq_#kaqbWLIon-{Wm*|%vF&B-(w$dxXG4C7{i9>>u z4o7-1MEu}Ia(ls5!esb@L*cw@V#L~nv<0%@t1%p z8<lIOBen4(HSv2~{Lb3=oi*`0Vn%C!!g*4ocrJ^>_PU5TT)Av8DwpfIiRJ3F zC;X~huaCnlj^j#Ivcp2wUA;*0s7B>-%xes4&MZ=(-r6YE!>OD~;8ac-9A0LM;f&P5 z*`ucv1c%@gNh0jxn!n)%+o8>9kxU<<&=#z`A()i@k1k{AEc01MPPi zH+g#54f6>hF-pVqA-xJjPL7SOBg#6OmuahZmp5M0qs;Zg*JnE;r0v|89I&ARd?eI* z7c)#Rn8xKKmrZfdBFiV^@oAC8Z<};xecVktCs8b}yQu4pQFP-jsI+eQO;NcJm1~N+7@{sVMZFoK-fW7x5~8j&MbX|IhL@Y7u7;?qO;OiE)U~FlOCjn~ zV^oDVAFQm(dLPvhX_<}%k(kbvgCWhqrtAko)Pbg`p%69H6cy$iD)F2HazHB97=}Zx z;ig=H1(hZiRQ85kdz*5Ngs73Gs6!#@P*c>-5Vf-@>PUz>(iFu)n zQD;Nc*`_Eue*wg7XpAbo9hlv6_D!{Bw~%p}_PG%l~tw zF5PM0yDaDT&ArjS_t^J=0J_7x1Ij(ZXX8rzOx!56+^5h9eGc+rlbpwkO>%^>-HpIg zhLqdxrcfq|REIP6J!{`r70%8tzSxm+pK~>_-CY)NJp^E^tpW>@D4Ywy@E93vy3?Xc zeFmvN&ca3)j~G)Cieo2>zEKE9KgUkCs)SmwJw;B2$y}*xF1?JY5{)SA0}u)y7%Zz# z$?8^mDTcs;JNe9pbR=V?ojk0xs}8Jln5m_0p#Fg6M2!19e zy;eqI@La=VIAU9tFIY}V4=V#n@D&5V?6>C~qb?pCwGw|B!q_xV!Bnf#Zr^)FI-6Q= z?_&fQ1FLLORZHK15gX*HNWPh6woD7={-%9jvXHYYI%vQG`;LWP;+rnI6jv?eib9y{ z)c2Zwl@bfjz6+GIR<6=EeXHv%^k;?~#IX1~emh2(B^d{ zSPNxz5#+Y*o4NUSFcp2y`R?DoHMhP0p~2CI1_!q6=-=_+*8cplZMhx&gIlxx4{aaa zzHM7J|4{!xHj2`zXl;PJS%^l_c7pchXQt=I3)8bFpPHTc^jM)VGxzZ4KKJx^VQl{B z=F#cN&xJgn6G|iFN26$4D(VBkT=wbw-t6czo4=5s%0sw(t|o9_er|f=cz#w_2yjsV ze_SwtgDrBP*gdUSp=KUMhr_*8Cu>ggi`_YdtqIW@X#j?bgH z!-oe3qX;H%S{l&(L%X4UA^+v+Tt3bM?S@m)Z@0=J@S)VX$7iP}Yp{u7?AR7XkENoW zHv^<4j0cYlERXyMsLvJRLI?V{AK7|~IUYO$fgVjo54FN{U;g*zDP(UxKf8Y_J2N*n zT~pxJ?LzV4RJ5&C_Wkom=SI1_G(R$aJpcLW+{pynK}!DpR5ZVTer9Ikq}^RAiQ6?_ z7@O9ms6jfc9b~66`4cnTWjbESWJ8J!VmUgtIdfoae2(TZIfFg4mw9-$s4Y}1y_s&iW z;o19#OqOB-?pRK4m&`Ag#MvKOPCM<+P2E3a$`mCK>+f660f$=)xs{>Ty=%5Gek?nh zpoTJfBo*ygnlerz?;jdbXCFj7!EuY)b8EWR<=#C#G0`B_1B1)!gODFxIyqiwE`FP` zFH>i0PWKNzF?F0vpcAaOAAwZAm5R16UuWMAzcMv3K2?+ZL1$qspVufISh>Z>B(vmJ zGHq4mcBG=MH_r5Ab}H#!wir=|QqhAqmvQ&>Y*M=|M$#K+{>n^#s)-+4tea@9-UB<8 zc?oIQa)aI>WZ(6y)0(@p2-IxM)~)>_*jH20$kO#5$v>SPJ-Kf_Hv?k}=-C6a*(ucI zY*4tMOGB!~=ot1! ze)jnIXx{6fC$lp%`COd|fed~n6@Bp^49u4oBZqeTd@6e69{?`~0i{~^bj#N7E6>tn z#Bc_%LJy{*{kMjTDDJLu&*wbl_h!*_*@*-&jlQ)B(+b1=+2eV}LWQJ>$gqAq745n; z1ovd;#vUJ^r~v~HTN@W19pAA?E}JDvh_oiT&*}j!FPqpot(7=K!_jH%$dj>Ddi%7F zvaJzm&flT|yWXJn2&5U1N2Ec3Xlb_sWMn#<+dG>-K0ZC4*lq)Gr}Z$V8I!LZoukd> z_fOByj@Iya`F6#Kad&ofET4d5ph>Hj%*DiIT+_O%dTgqI%@6j+vPb8dZHQ&Nxf|rA z+}0{VvLDN)>z#K^<#ta`(oM&hZ&_A()`4(2zdAoXJ3qOb350Q`0`dtrwxSbS3)miw z%4^%Nbb5;>Ll4oqf6`Eo$&|6|)YJLU+0|57ABoBa= zs=pLKYfdf&;qi(28v3c(x3<1o=RXELhx1Hl#-!XzpKxoCzL3W(WL{-fb0<&cCy(;t zjHcDLBAu-vC06Zn^0j3!$X9Fr?q#&ZwBFaVOlTk-ThuE|&eYluhIwQlyFJWly7G2$4YlW1+ew8-syzgXU78n%|w<$*L?Q?0v+Mo8Wu z3q~hXkqJu3>yxQy&(d92BOu>jc|fsAkU(43K5GFj2zCMmp0}358$hY2)0Sm*RU;@* zr-0DjT0&{6@5`y^iCZF6fYeN>E!ZqKY^;sa*ig4+t&SFT^Bm0Q>MOUbao!AS)Y&Z! z_`v*STD+UgYpl`|ltGo>JeU@P7B^|JOoNS=u^y*?b#^Y@lg!h4V|h7^9Hyo{eVV5! z)ZSYw^c!bio-2O!BQAaES@wZt?XD&q3`npZ5>tP`=FFF&r$^?osoc!;_!M@&mZbvp zxMgpFAgztSkh~s9GcsFj!Qocm)YU4%#wxXptSwoofKLL(=GVTIiXLBDH_%CWg?Ur` zCVHkdN=v|MF{E0yF)j(l+Y=+x(=&1122jPV)l>pTlMre?yGFI>T@L~Q+?|RZy%BK& z2>W&BNrDEoY0d9eXvB*e2^@4wYvZ{Y&VI}@o41M~s6%PJzL-GxI!kqsLvx}@-sSA> z#;i8}u#Et5{$)*&#{Ax}3rmwRkY!a;BM|zpTs;mjv-R+$F}tS69y@`8ok%Q9IC=8` zRDL4>SlAi>wPryiOpOI2w|=$&GPah-r2zzpwNz|9ZM-y$WrzH&&7Ea|H4W0CZtMB6 z`-dJKJ$#tDXiv%RiR|3mgIf+WJ%9huP*7?bXK#5lx16c71e9$JP_%>GW_7_WsvkC{37Gn` znPq^5GzO2(j|#X{hCrX$;=yQqjNpg5Nn?zo&HHH1Df3B%7Yiu@!AHTVQ%(xpfP6 zZ)hLz^pv*MI00zNy_y%XBHt6(A830>2;l?`Rqk@E|0&NpW(W{T@hMXP5`deENEJId4+%X5nDf%xA0 zB{nL%`pjfcPO#`6=gp7L6qFdIt+b{Vag-?PCLgK|h2{~1*{eVkHRO`!XJ@C8R8a^7 z1jKFQ&f3&Kob8LOmp;X&@_3NGZ=QvTN$9aT6ShTUv`0~^6&d!^PEE7ZHZwDJat{4A zkqO*j1Ec$U`{^rx9HpMzE9LnI{9E`@XSDFgPBxT6LUsrLKFhyVf7uzWI+w%|6!qv+ z^S5vR@cwUJI=<=k?CZP#7&1UXl{1&P+jXjT)FIQj-CAVi8jyVjz;_U?Ao$zd*l)L<6|BHRdV2| z=nwz=7ys=KKl}Nyb5Bu`@HZ`YCiv=qvo-0W=rEhhh9@ST%#Ke*lWZfI&F44gCMH6b zzrPPKJ%8%u;d~-gmf*iOw5kjB4J!ImFV^2*q8SOmYhEfOTKfC0m#sgmZH9!uRwJ)U z_ouNm6@NR5!aoNOC23-=bpNG6K>u@{paaLZ+w)1&QMTyMf<$@5F4VWb==GSlaU-^T z-)j);?=`g23-v8K`V-$+zUv#xo2^xc!T;CKzhnx~c~JfJ2z)&itUHYu<1~dU-5&lO zyw({#-Y%c}d%T@dUi7tSe{`7dW6?fbPefmdzKs6~zK`S9-w)gW@Bee!QreC&nrY4* z5sl9N1X4P-_HP&u1EVM#%>rjUnuzkioQjS`)0XUB>(CDnn!E z(D}2$knmYzrlO~pfK;|L{nXq2Hy9li4WdiYA@c49-X#C!$z7ln%$#VRvI^0Ygv~`` z(ZeXV9MI={DMyJf5SJr-mfx(U9yb^n`zn|62;VHFWyzZ-MDvQEMwmrwLke&I7}6cr`0 z8TcEHxC$nw+c2r-EX_D&)Y7{Vhs`mCqG$^j-z6}<28>ytB)l4kHbe8x(KfJ@%axlZ zk2o%B&hjftCK$IaZ!=V!;J+yP_t8dRjFA6n%PnrsL??kZPRJOL(e={oe3gt&BG(g8+EKKY+qHNEUW=Ch`uERBfwwv%4P>ee&;RxB IUmgYiKg)LLQ~&?~ diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.pdb index da5d6496d8d81186e3fde9ae828e8f9c9316e687..39ae7b7cb37edcc01c718d02e903a34548d7086b 100644 GIT binary patch literal 160904 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 uEFSA#abc5h{Ehd<7?h*B00W{$>%M$~#eoDZYZ0 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 literal 207028 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 Bv!04exR&B0Uv&mQ;PI^QGw&^8m`y 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 diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.WebSockets.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.WebSockets.dll index ceadb3c6de32939f48e2072a5fb87a4e4912c039..0a2e32de7dc72e18cc73dc8b3fca7792774f4c51 100644 GIT binary patch delta 706 zcmXw%K}Zx~6vyA2*_p{&SIx+6XMCEM0Ty~tdwLu6uy=wM>UK#-tA(Jd$l`sOP?m>=_g|Bp8h-sE%nT;ZW4In!Vz=un)t8uWOq+E+~)&hgYCWXoQ1spKpgOOp5KWpR$9Q ze#SKOY39=~0SjV=d5d|Ad5ijY;tcq}C(W|7%+fMT%QXEizF>YGf^aA)t+Qf-aR)4z z5_X+H+GXYoBahBNF7$yV%8Vgq+8I+whZgf_!KSe0yz{_W5GH=FKQJjybB>u|e9riW zo2T7?rz8n)2p^E!-U*D6U*0gr?7$JZs(PS0__b;~+c|A^3^c!vzO~KzTA|8NG=KvL zVnorDsA11H)NqHPB*h;A_Lv;q#Vz`5(|v4{HMLGK>B>yT_tcB()#1x(c08?;Qo}K?+Lsy4q_P=xER)OTQez{j@ey5#u<)F6ZDbhwyV~?< z6Z~&h*lXqturjyx^m_B9t>CA|?gjeUz4J0oK59N(vcG9TBwFM=@#rm;N!MNukR%B` zS`nkd87fBR^c44sC%^R|KD7OfvxtUWK2t(o2Z?kxo#G7uve6V33{XI`YtHszMeDym N@k0wOe_&CQ{sQGQuoVCR delta 889 zcmXw&Ur19?9LIm>Zg*2ND;K&%vpM_&w(acCz1|6#HTnnsSt+8m2d{Tm{D;zZ_Yfkj zrqDx3<3v5=gKLE{dZ|nF5JF;+Pm#Su4}oCz5+P9`hD7I{+=27G=lA*k&OJZ)os-m( z+MQeGVE3D!fDS!X)eQ?k+l&~w03fo4oAfZ(UyOS7rzIB)PzN!UpSs@8yFmd%N8u{(hfX#7bF<9NQn$?dnDG^;ffJXl zD=c`!bRAN#$Zr^ib%T*jrY2+*WJVS6#NuG;WF*8?My2q=l0+%k;g{)p)&yJ%I!Kkh zs(Qh4gEPo9(??8SaS!OLTK9&WJlEutF(1Q2+5bC-5;*FzV31JSRI&U!lMXzS<5bB{Ch zuI@)>^zZA_^Iv{$cDrp$M%LNpNH{hzqAFTE5=x9|ZNmdDS=ENr*s$!96WY*3Y*@P% znHU&}#A8Y%Uxqz$NgY$=xEdK(wYVmaN99=5=l13k%6)r>eOTW+%qaP@%Unyusq>$_ zSMGkJW#tENT+L%?M;Y4I=Wz`pCBByZIdk3y$dNvuP$*Gg)GU$vKA9^rlRv&1^i{9& z&mbh~*+2%FrU8?4Vq=#GjUa*_qEs;iAwaLGpGmMzk3 mk#d2?D&2?aKA9v$ffvCISYN{&Ds27#fb1vrL(&#XW9vWQGT^KL diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.dll index 7dfdce214bc17540623aa94624ac5a1253deba26..6ec371913b3139d7f9929774622e107cdb2420d9 100644 GIT binary patch literal 524288 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

EuyOAB#QRd)pdXT>iSEq!7 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%0AR`g`E} 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 bkUs}&b;?70iQXSH+&-u}$ofNkQ Date: Mon, 14 Sep 2026 16:16:32 +0200 Subject: [PATCH 07/94] Add HLSL vector conversions, int clamp, and double frac to CultMath Aetheria Cut 8a needs int2(float2), clamp(int, int, int), and frac(double). Fill them in CultMath as dxc compiles them: - generate-swizzles.ps1 emits same-size conversion constructors and math functions between float, int, and bool vectors. dxc lowers float to int as fptosi (toward zero; NaN and out-of-range undefined), numeric to bool as != 0 (fcmp une, NaN is true), bool to numeric as 0 or 1. floatN(int) splat keeps floatN(0) from going ambiguous against floatN(intN). - Int and int-vector clamp are min(max(x, a), b), matching dxc's IMin(IMax(x, a), b); inverted bounds return b. - frac(double) keeps double precision. dxc demotes double frac to float, as it does exp and lerp; CultMath's existing double overloads already diverge that way, and design.md now says so. Co-Authored-By: Claude Opus 5 --- packages/cultmath/docs/design.md | 13 ++++++- packages/cultmath/src/CultMath/Swizzles.g.cs | 39 +++++++++++++++++++ packages/cultmath/src/CultMath/math.cs | 8 ++++ .../CultMath.Tests/HlslSemanticsTests.cs | 37 ++++++++++++++++++ packages/cultmath/tools/generate-swizzles.ps1 | 27 +++++++++++++ 5 files changed, 123 insertions(+), 1 deletion(-) diff --git a/packages/cultmath/docs/design.md b/packages/cultmath/docs/design.md index de09ee26..ad8409fd 100644 --- a/packages/cultmath/docs/design.md +++ b/packages/cultmath/docs/design.md @@ -52,7 +52,18 @@ That makes these HLSL rules, not options: operand returns the other (so `saturate(NaN)` is 0), `clamp(x, a, b)` is `min(max(x, a), b)`, and `saturate(x)` is `min(1, max(0, x))`, which maps -0 to +0; `any`/`all` accept numeric vectors (a component is true when it is - not 0); `min`, `max`, and `abs` on int vectors return int vectors. + not 0); `min`, `max`, and `abs` on int vectors return int vectors; int + `clamp` is `IMin(IMax(x, a), b)`, so inverted bounds return `b`. +- Same-size vector conversions (`intN(floatN)`, `floatN(intN)`, `boolN(floatN)`, + `boolN(intN)`, `floatN(boolN)`, `intN(boolN)`) exist as constructors and + `math` functions and follow dxc: float to int is `fptosi`, truncating toward + zero; numeric to bool is `!= 0` (`fcmp une`, so NaN is true); bool to numeric + is 0 or 1. DXIL leaves float-to-int undefined for NaN and out-of-range values, + and so does C#; CultMath does not pin them. +- dxc demotes double `frac`, `exp`, `lerp`, and `floor` to float. CultMath's + double overloads keep double precision instead: `frac(double)` is + `x - floor(x)` in double. That is a deliberate divergence for CPU simulation + time, which shaders do not carry. dxc marks float arithmetic and compares `fast` (no NaNs) unless a value is `precise`, so drivers may optimize NaN handling away and NaN results on real diff --git a/packages/cultmath/src/CultMath/Swizzles.g.cs b/packages/cultmath/src/CultMath/Swizzles.g.cs index ce84bbc4..db1c56bd 100644 --- a/packages/cultmath/src/CultMath/Swizzles.g.cs +++ b/packages/cultmath/src/CultMath/Swizzles.g.cs @@ -7,6 +7,8 @@ namespace CultMath; public partial struct float2 { public float2(float2 xy) : this(xy.x, xy.y) { } + public float2(int2 value) : this(value.x, value.y) { } + public float2(bool2 value) : this(value.x ? 1.0f : 0.0f, value.y ? 1.0f : 0.0f) { } public float r { readonly get => x; set => x = value; } public float g { readonly get => y; set => y = value; } public readonly float2 xx => new(x, x); @@ -72,6 +74,8 @@ public partial struct float3 public float3(float x, float2 yz) : this(x, yz.x, yz.y) { } public float3(float2 xy, float z) : this(xy.x, xy.y, z) { } public float3(float3 xyz) : this(xyz.x, xyz.y, xyz.z) { } + public float3(int3 value) : this(value.x, value.y, value.z) { } + public float3(bool3 value) : this(value.x ? 1.0f : 0.0f, value.y ? 1.0f : 0.0f, value.z ? 1.0f : 0.0f) { } public float r { readonly get => x; set => x = value; } public float g { readonly get => y; set => y = value; } public float b { readonly get => z; set => z = value; } @@ -320,6 +324,8 @@ public partial struct float4 public float4(float2 xy, float2 zw) : this(xy.x, xy.y, zw.x, zw.y) { } public float4(float3 xyz, float w) : this(xyz.x, xyz.y, xyz.z, w) { } public float4(float4 xyzw) : this(xyzw.x, xyzw.y, xyzw.z, xyzw.w) { } + public float4(int4 value) : this(value.x, value.y, value.z, value.w) { } + public float4(bool4 value) : this(value.x ? 1.0f : 0.0f, value.y ? 1.0f : 0.0f, value.z ? 1.0f : 0.0f, value.w ? 1.0f : 0.0f) { } public float r { readonly get => x; set => x = value; } public float g { readonly get => y; set => y = value; } public float b { readonly get => z; set => z = value; } @@ -1001,6 +1007,8 @@ public partial struct float4 public partial struct int2 { public int2(int2 xy) : this(xy.x, xy.y) { } + public int2(float2 value) : this((int)value.x, (int)value.y) { } + public int2(bool2 value) : this(value.x ? 1 : 0, value.y ? 1 : 0) { } public int r { readonly get => x; set => x = value; } public int g { readonly get => y; set => y = value; } public readonly int2 xx => new(x, x); @@ -1066,6 +1074,8 @@ public partial struct int3 public int3(int x, int2 yz) : this(x, yz.x, yz.y) { } public int3(int2 xy, int z) : this(xy.x, xy.y, z) { } public int3(int3 xyz) : this(xyz.x, xyz.y, xyz.z) { } + public int3(float3 value) : this((int)value.x, (int)value.y, (int)value.z) { } + public int3(bool3 value) : this(value.x ? 1 : 0, value.y ? 1 : 0, value.z ? 1 : 0) { } public int r { readonly get => x; set => x = value; } public int g { readonly get => y; set => y = value; } public int b { readonly get => z; set => z = value; } @@ -1314,6 +1324,8 @@ public partial struct int4 public int4(int2 xy, int2 zw) : this(xy.x, xy.y, zw.x, zw.y) { } public int4(int3 xyz, int w) : this(xyz.x, xyz.y, xyz.z, w) { } public int4(int4 xyzw) : this(xyzw.x, xyzw.y, xyzw.z, xyzw.w) { } + public int4(float4 value) : this((int)value.x, (int)value.y, (int)value.z, (int)value.w) { } + public int4(bool4 value) : this(value.x ? 1 : 0, value.y ? 1 : 0, value.z ? 1 : 0, value.w ? 1 : 0) { } public int r { readonly get => x; set => x = value; } public int g { readonly get => y; set => y = value; } public int b { readonly get => z; set => z = value; } @@ -1995,6 +2007,8 @@ public partial struct int4 public partial struct bool2 { public bool2(bool2 xy) : this(xy.x, xy.y) { } + public bool2(float2 value) : this(value.x != 0.0f, value.y != 0.0f) { } + public bool2(int2 value) : this(value.x != 0, value.y != 0) { } public bool r { readonly get => x; set => x = value; } public bool g { readonly get => y; set => y = value; } public readonly bool2 xx => new(x, x); @@ -2060,6 +2074,8 @@ public partial struct bool3 public bool3(bool x, bool2 yz) : this(x, yz.x, yz.y) { } public bool3(bool2 xy, bool z) : this(xy.x, xy.y, z) { } public bool3(bool3 xyz) : this(xyz.x, xyz.y, xyz.z) { } + public bool3(float3 value) : this(value.x != 0.0f, value.y != 0.0f, value.z != 0.0f) { } + public bool3(int3 value) : this(value.x != 0, value.y != 0, value.z != 0) { } public bool r { readonly get => x; set => x = value; } public bool g { readonly get => y; set => y = value; } public bool b { readonly get => z; set => z = value; } @@ -2308,6 +2324,8 @@ public partial struct bool4 public bool4(bool2 xy, bool2 zw) : this(xy.x, xy.y, zw.x, zw.y) { } public bool4(bool3 xyz, bool w) : this(xyz.x, xyz.y, xyz.z, w) { } public bool4(bool4 xyzw) : this(xyzw.x, xyzw.y, xyzw.z, xyzw.w) { } + public bool4(float4 value) : this(value.x != 0.0f, value.y != 0.0f, value.z != 0.0f, value.w != 0.0f) { } + public bool4(int4 value) : this(value.x != 0, value.y != 0, value.z != 0, value.w != 0) { } public bool r { readonly get => x; set => x = value; } public bool g { readonly get => y; set => y = value; } public bool b { readonly get => z; set => z = value; } @@ -3102,9 +3120,15 @@ public partial struct double3 public static partial class math { public static float2 float2(float2 xy) => new(xy); + public static float2 float2(int2 value) => new(value); + public static float2 float2(bool2 value) => new(value); + public static float2 float2(int value) => new(value, value); public static float3 float3(float x, float2 yz) => new(x, yz); public static float3 float3(float2 xy, float z) => new(xy, z); public static float3 float3(float3 xyz) => new(xyz); + public static float3 float3(int3 value) => new(value); + public static float3 float3(bool3 value) => new(value); + public static float3 float3(int value) => new(value, value, value); public static float4 float4(float x, float y, float2 zw) => new(x, y, zw); public static float4 float4(float x, float2 yz, float w) => new(x, yz, w); public static float4 float4(float x, float3 yzw) => new(x, yzw); @@ -3112,10 +3136,17 @@ public static partial class math public static float4 float4(float2 xy, float2 zw) => new(xy, zw); public static float4 float4(float3 xyz, float w) => new(xyz, w); public static float4 float4(float4 xyzw) => new(xyzw); + public static float4 float4(int4 value) => new(value); + public static float4 float4(bool4 value) => new(value); + public static float4 float4(int value) => new(value, value, value, value); public static int2 int2(int2 xy) => new(xy); + public static int2 int2(float2 value) => new(value); + public static int2 int2(bool2 value) => new(value); public static int3 int3(int x, int2 yz) => new(x, yz); public static int3 int3(int2 xy, int z) => new(xy, z); public static int3 int3(int3 xyz) => new(xyz); + public static int3 int3(float3 value) => new(value); + public static int3 int3(bool3 value) => new(value); public static int4 int4(int x, int y, int2 zw) => new(x, y, zw); public static int4 int4(int x, int2 yz, int w) => new(x, yz, w); public static int4 int4(int x, int3 yzw) => new(x, yzw); @@ -3123,10 +3154,16 @@ public static partial class math public static int4 int4(int2 xy, int2 zw) => new(xy, zw); public static int4 int4(int3 xyz, int w) => new(xyz, w); public static int4 int4(int4 xyzw) => new(xyzw); + public static int4 int4(float4 value) => new(value); + public static int4 int4(bool4 value) => new(value); public static bool2 bool2(bool2 xy) => new(xy); + public static bool2 bool2(float2 value) => new(value); + public static bool2 bool2(int2 value) => new(value); public static bool3 bool3(bool x, bool2 yz) => new(x, yz); public static bool3 bool3(bool2 xy, bool z) => new(xy, z); public static bool3 bool3(bool3 xyz) => new(xyz); + public static bool3 bool3(float3 value) => new(value); + public static bool3 bool3(int3 value) => new(value); public static bool4 bool4(bool x, bool y, bool2 zw) => new(x, y, zw); public static bool4 bool4(bool x, bool2 yz, bool w) => new(x, yz, w); public static bool4 bool4(bool x, bool3 yzw) => new(x, yzw); @@ -3134,4 +3171,6 @@ public static partial class math public static bool4 bool4(bool2 xy, bool2 zw) => new(xy, zw); public static bool4 bool4(bool3 xyz, bool w) => new(xyz, w); public static bool4 bool4(bool4 xyzw) => new(xyzw); + public static bool4 bool4(float4 value) => new(value); + public static bool4 bool4(int4 value) => new(value); } diff --git a/packages/cultmath/src/CultMath/math.cs b/packages/cultmath/src/CultMath/math.cs index ca74857f..f5c81095 100644 --- a/packages/cultmath/src/CultMath/math.cs +++ b/packages/cultmath/src/CultMath/math.cs @@ -105,6 +105,9 @@ public static partial class math public static float2 frac(float2 value) => value - floor(value); public static float3 frac(float3 value) => value - floor(value); public static float4 frac(float4 value) => value - floor(value); + // dxc has no double Frc: it demotes to float, as it does for exp and lerp. CultMath's double + // overloads keep double precision instead, so frac(double) is x - floor(x) in double. + public static double frac(double value) => value - Math.Floor(value); // dxc lowers float min/max/clamp to DXIL FMin/FMax (saturate to Saturate, defined as FMin(1, FMax(0, x))). // DXIL.rst: FMin(a, b) is a < b ? a : b, FMax(a, b) is a >= b ? a : b, and a NaN operand returns the other. @@ -130,6 +133,11 @@ public static partial class math public static float2 clamp(float2 value, float2 minimum, float2 maximum) => min(max(value, minimum), maximum); public static float3 clamp(float3 value, float3 minimum, float3 maximum) => min(max(value, minimum), maximum); public static float4 clamp(float4 value, float4 minimum, float4 maximum) => min(max(value, minimum), maximum); + // dxc lowers int clamp to IMin(IMax(x, a), b): inverted bounds return b rather than throwing like Math.Clamp. + public static int clamp(int value, int minimum, int maximum) => min(max(value, minimum), maximum); + public static int2 clamp(int2 value, int2 minimum, int2 maximum) => min(max(value, minimum), maximum); + public static int3 clamp(int3 value, int3 minimum, int3 maximum) => min(max(value, minimum), maximum); + public static int4 clamp(int4 value, int4 minimum, int4 maximum) => min(max(value, minimum), maximum); // DXIL Saturate is FMin(1, FMax(0, x)); that operand order, unlike clamp(x, 0, 1), maps -0 to +0. public static float saturate(float value) => min(1.0f, max(0.0f, value)); diff --git a/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs b/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs index 7b845ea7..ac97f92f 100644 --- a/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs +++ b/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs @@ -311,6 +311,43 @@ public sealed class HlslSemanticsTests Assert.Equal(new int4(5, 5, 5, 5), math.int4(5)); } + [Fact] + public void VectorConversionsFollowDxc() + { + // fptosi truncates toward zero; NaN and out-of-range inputs are undefined in DXIL and not pinned. + Assert.Equal(new int2(-1, 2), math.int2(new float2(-1.7f, 2.9f))); + Assert.Equal(new int3(0, 0, 3), new int3(new float3(-0.5f, 0.5f, 3.99f))); + Assert.Equal(new float4(1.0f, -2.0f, 3.0f, 0.0f), math.float4(new int4(1, -2, 3, 0))); + // Numeric to bool is `!= 0` (fcmp une for float, so NaN is true); bool to numeric is 0 or 1. + Assert.Equal(new bool2(true, false), math.bool2(new float2(float.NaN, -0.0f))); + Assert.Equal(new bool3(false, true, true), math.bool3(new int3(0, 5, -1))); + Assert.Equal(new float2(1.0f, 0.0f), math.float2(new bool2(true, false))); + Assert.Equal(new int4(0, 1, 1, 0), math.int4(new bool4(false, true, true, false))); + // intN(intN) is exact; it must not promote through float and lose 2^24 + 1. + Assert.Equal(new int2(16777217, -16777217), math.int2(new int2(16777217, -16777217))); + float2 splat = math.float2(0); + Assert.Equal(float2.zero, splat); + } + + [Fact] + public void FracAndIntegerClampFollowHlsl() + { + // frac(double) keeps double precision; a float frac of 1e9 + 0.25 would return 0. + Assert.Equal(0.25, math.frac(1.0e9 + 0.25)); + Assert.Equal(0.75, math.frac(-0.25)); + Assert.Equal(0.5f, math.frac(2.5f)); + + // IMin(IMax(x, a), b): the result stays int, and inverted bounds return b. + int clamped = math.clamp(7, -1, 3); + Assert.Equal(3, clamped); + Assert.Equal(-1, math.clamp(-5, -1, 3)); + Assert.Equal(0, math.clamp(1, 3, 0)); + Assert.Equal(new int2(0, 3), math.clamp(new int2(-4, 9), 0, 3)); + Assert.Equal(new int3(1, 2, 3), math.clamp(new int3(1, 2, 3), new int3(0, 0, 0), new int3(5, 5, 5))); + Assert.Equal(new int4(2, 2, 4, 4), math.clamp(new int4(1, 2, 5, 4), new int4(2), new int4(4))); + Assert.Equal(1.0f, math.clamp(2.0f, -1, 1)); + } + [Fact] public void MatrixMulFollowsHlslRowMajorConvention() { diff --git a/packages/cultmath/tools/generate-swizzles.ps1 b/packages/cultmath/tools/generate-swizzles.ps1 index 9030f2be..e5f79011 100644 --- a/packages/cultmath/tools/generate-swizzles.ps1 +++ b/packages/cultmath/tools/generate-swizzles.ps1 @@ -21,6 +21,19 @@ $families = @( @{ Scalar = "bool"; Sizes = @(2, 3, 4); Functions = $true }, @{ Scalar = "double"; Sizes = @(2, 3); Functions = $false } ) +# Same-size vector conversions, as dxc lowers them: float to int is fptosi (toward zero; NaN +# and out-of-range are undefined in DXIL), int to float is sitofp, numeric to bool is `!= 0` +# (fcmp une, so NaN is true), bool to numeric is 0 or 1. Keyed "target<-source"; {0} is a +# source component. Identity forms (intN(intN), ...) come from the composition loop, which +# also keeps an int vector argument off the lossy intN(floatN) overload. +$conversions = [ordered]@{ + "float<-int" = "{0}" + "float<-bool" = "{0} ? 1.0f : 0.0f" + "int<-float" = "(int){0}" + "int<-bool" = "{0} ? 1 : 0" + "bool<-float" = "{0} != 0.0f" + "bool<-int" = "{0} != 0" +} $componentFields = @("x", "y", "z", "w") $namings = @(@("x", "y", "z", "w"), @("r", "g", "b", "a")) @@ -86,6 +99,20 @@ foreach ($family in $families) { } } + foreach ($source in @("float", "int", "bool")) { + $expression = $conversions["$scalar<-$source"] + if (-not $expression) { continue } + $converted = for ($i = 0; $i -lt $size; $i++) { $expression -f "value.$($componentFields[$i])" } + Line " public $type($source$size value) : this($($converted -join ', ')) { }" + if ($family.Functions) { + $functionLines.Add(" public static $type $type($source$size value) => new(value);") + } + } + if ($scalar -eq "float" -and $family.Functions) { + # floatN(int) splat: without it floatN(0) is ambiguous between floatN(float) and floatN(intN). + $functionLines.Add(" public static $type $type(int value) => new($((@('value') * $size) -join ', '));") + } + # Single-component color aliases; x/y/z/w are the fields themselves. $letters = $namings[1] for ($i = 0; $i -lt $size; $i++) { From f0605367e0d7e57941a57bacb0b8cb8d893073be Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 14 Sep 2026 16:16:32 +0200 Subject: [PATCH 08/94] Release CultMath 0.2.1 Bump the package and assembly version and rebuild the tracked Unity DLL and pdb from a deterministic build. Co-Authored-By: Claude Opus 5 --- .../cultmath/src/CultMath/CultMath.csproj | 2 +- .../Runtime/Plugins/CultMath.dll | Bin 296960 -> 299008 bytes .../Runtime/Plugins/CultMath.pdb | Bin 140892 -> 142220 bytes .../unity/org.gamecult.cultmath/package.json | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cultmath/src/CultMath/CultMath.csproj b/packages/cultmath/src/CultMath/CultMath.csproj index 7c567105..1c2bfe24 100644 --- a/packages/cultmath/src/CultMath/CultMath.csproj +++ b/packages/cultmath/src/CultMath/CultMath.csproj @@ -8,7 +8,7 @@ CultMath CultMath GameCult.Math - 0.2.0 + 0.2.1 Clean-room C# math shaped for HLSL-style renderer code. GameCult README.md diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.dll b/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.dll index bf712012ee75b870340835a98c75593f17d6d33e..d3c4a62fa9d4b99e1c064d91904c32608a6df662 100644 GIT binary patch literal 299008 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

pt4b- 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¥9?V=YH2icYj`+vw|)GeGtd z`X*cUom=+1_xrC?+vvu>lRD&>jM_JCCVMC6!`@|OzpW9AwrKA%?;Xj>af~?AWX#*> pSBd@&(~q2e$m#*Vtu4=%zfgw^8Rn9|IbF?e*!@gCshCd literal 296960 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

yXUIFsG|bMBca$@+ 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�gNhH{l&O@B|hP4Aojwvwm!t*rNLtoN;=_sv&+`n!y${PZ`PvdT|?uc@T` zlREzsI{z<}aEJ2K-+DGHC;i>$YvrWB0Uc4!66L?6{C_IHzWOif`roPRpVjq$TKRA4 z`d_c>UrpElHRa!@>o8Q;p^L7=yUH1&{3n(Fi1L4RlAl`o`&W)$O@9mPp!ZFG7rRyO zTSo6&PwyM)eMjhh)8Ew2D<}PZEmA-It*x~3kLdir)%kDJ8Fo^B`a9i9<)pva?N(0u z``!NEuCwx&DSxK&tE)d%*T1u_{~2B9vC3bh>)%4xznuDWm4An>!~MDrH|jbpSI&LP zAEo@k%0I2^e~G^T?p6NN`uSGVtIhPjZz=yZOZLW zEmF=><=>rnXa5b`MY%f`*i*rb%xg~|1IT=Renw7FHz2Z zU7x#^-&XmbC?{X}&nthR@^}4qot3{p`OhlH0 z<@Zs3YvsSHoZiZRSowca{&%|mS5z9yr{HXv#8<<_R(|3eWyj+cm7d14WfGsR^$Z@V zm-s;K#MwECO=?ZU$Ll3pwG(g1N$joutLk5={zK|FsFdvbxlH2i6%%)qPOM)k*>$E& zV%Lg^pOsGhRqHM4*VXzJ_0wngYWRPiXX`7HtQ?*WVBG*-s{>DLv(kybYQ07Mx>~=Yeom$29DXX3cw5E9?WGgXYyFY>b+n$R zel;C`T>TE}f2jVCTCY>TveqxEf2oyR)y}ep{Ih(c>>Kpc*Z|Ew&;77|?yYppKqbGVpMDh`(^0z~*RGxF6#uO#Y>-^%;=dcquSh!E^iwWf zKUv@3FtPaW%mwW#{+qL3yP`VDk*&4sdF^^czd4`lH>ZJ)xl_p#_4^a*nBQyHK9^M!IMY1dHgD*jvQ>zLxdt4Gu+tM|H5yJlSQ#VeQ(Y&Q;nqO1nPS8D3PUopxuw#hP`gU%n1(uLh<2S+ zr;6UIi*_y0uBWu?TkUG8WA4|kS=v=u$K0e{qqOUDb&7vB7lz62XYo(y<{;_#6%s4y zGy8QmSr`B0E(nv~x8k4Q4}+wWsgPJvpWOY~WL^Ao{g`$Y|8!5(uD#`xBflz@xLmtF z(*&5UY0z4`&MEm(CHK~@m$d5*?HaFL#b?F*F!_BeJ~1{0Nyn>@SV5otud>Oy_#_#r zUB&0gQ`+@q`Q*rbr4rxJuI-v3FKM2%(ym{WJVMELYu7C8TBco3YFF{;^pbWJpHc5= z*Lm$KshpkKReW|mq+P`)*ck2Fu3ew&y%uWMhdRS)I>V;gby8>eppv_3*K^vnK)Xh1 zS2@kkZ?tQgc3r2Owc52pyMELzU!9M&>zIytTe}8mR~dDt>X=8g>qG6@qW5}PyVmNM zr?u+}?K+|}?5|xnYu7~WnypqOW^&?*_@bcD2Ox{C}!i@;jft3yiFu^wal(o;8yG zT{RP5s+)LP)BEG9$vSu6Lc?YrTn*aM?0#17u~M5pg@y{jkv^qsDCjilecW@3Kb#69&BS5-|+-v<{dKYcfR zPWkD3;yC4xRQ^ikS8b3aA5wn$j(J4+>HFq(<)`nS%as4N@_$r*N9C7P&X4L}qr1r@ z^*gHnj_xvCO@=zoK$(QT{w#pGi9Z^u7D9%1__H?^AyI zKHf$7w<>?4@{cLMQ2FV*{F};8-|J^7KYhplyYin<{`<t~73HU&XQnIv zdF5|beq&vSGs;gt?bymmKl2<^KmFvhUimwe@98@CQhrUHr>E=OMg0Zp_fmhS`sH<< z|EBBTQu!-%{g0@BtFC`#+RE5EIB{;vF=lwY9yQp&kQ`MZ=qQTeu>46jkbB;^lP{zJ-N zqWoAn|5E;7}8LcZ2d?#t=t(EozVWV2Co&Gf6-FU0|S>^y}!E^ACFFteZ_b6Wzr0H-!?)Pk&#iqWtu?hAWl- z%jHSh&m|N8t%TmnPk*QQOgZUq7C$H_{r%#ka#kw;W92VaeiQZQ>3O@4p0`Vd$-7Te z{u(`XchXb$RYB5Uq5L7b4&!tk?$UMGpqxjQKUw)>l%G*Q{q5!|y_)`xbDQ2b{Y@uN z?^{{#+gR^gMem!h{Pg!APx{)b+np*FUT4|FrVo)b+n!*T0&s|7*&>PuF3nu0t1Hhj*1T zMEOrD{}JW?>Lfq4^mn%$y_)_8*Fo=_{vLO$-nWe2x1QcN()*6k`=-C;omWo!yI!Pz z`Ws(qz> z&SRCoNY}rGu75f8=PLgWU5ER19d6WhSgxG=ls`)OgOz_;*Z&fIciyY~r}gu#rdONk zecw|4Yszn?_dTZk3(8-w{Pud^Q2oo)x7B}8?^~ptrOLlY`NxzKs{fSo2P@xJf30!~ zl`~yAf%13h{P*enH|h+pSN>bd8LRx7%3q?K{klGPE5EJsKT%G;@}F1!K;`fH?K&%e zf%2bK{^jaFrTmu4|6VzdDu0IZuTuUc>c61;PRj42{MO2URXM$t|FH7^r2Ox6{og42 zKA(asDs8~CWfGsRwHc4pOMIYq;_RHnCbd4n$Ll3pwG(g1N$joutLk5={zK|ltF?ny z2i8kGp>>m-WPP*N)77t7JL&XRKS%wC)&E)RYt`?j^~>tl(((7H-=I=*RzH_XyuD)L zj?#(sDG-!rf7XPidpk2j(H}-2+ zR3|yIwRSzPU61H@<8%FPG|(}3DtV%QLqZ+%d+i#iU4`lt|4rMX_bUGT_O5ciP);T7 z8me8ze-C{fQ~bB_h&pBUUN>sjZ0#DOGu)>$yjsWfQSx&-!!kOijdne(U0c+-O1nmB z*XKIJi|Vw~t_{jLpq$#;^_X_utz#ByS4kbyP{$0>u9NCi(R+2#t_9llly-fqT`hIY z{n|B4yDICLo3v|`c73i+@lW5vF!}u~{u$gHBpts(VkLblzs@G>;-Ae0Ve_U%PJBu8G<; zTe}|CuK(9eZsq^qC$n2U`Rz^5=R@kJr}Tyz$?-dDCi=RQ_HK}@YgbE5&+w3 z>8Sc$bPuYc{415;N9X^xuFuOl|MVSdc(vqHnZ8f;uAcPMcdOPll79P|iTQOC_tZ~Z zRW&hvFI%Mi^d0Rv<)`m!ICwk~8^>?i3A_|AOupyVP%`yF;k_ipse~`SWyrCh7ds z_us!NKYbUzPxEauEY1r zPv6sjQGWW){-yHM_xE>{|B>>~EB|)oS5VG*^;_%u&sP6-_1EkAU#jaoTG#(-<-exu zzhC|Ky8dO9UrRaNmA^#S=Xsrf`sreV^3%^4k19X?q;Z$>dnkXF@_$tR7Uid(LpCZu z{WS85^3%^G)0O|c@;58Lv97}z<)@!mY~`e%TMnw9etKE2{2j{obe(%CzoyR9({=8m z{sQ%TslQYG^19A{)Aetu{1v+XN7TPn*T1sz8!G=Eo&QQ*pV>P9a>~h5{wn4FS^3|p zUtc+|D*q1UZ&ZGugg(l@M)|FjKSKGR>ebhk-&Q$)SN>1RFHn9d<=mnCUCN)Rd|OX< z*C=6<@`oz_A>}Voeyp5-DSxo?w9|Cv^VlXV;c~ za$inA!S>4N4xW0B9pokbdgT+ZEtQy~=i5ncvQ9tcUh60K<@B@eA2Ufm{lxo#m-OrE z>9mEOPV4FE^l3Ngr=N!}Ret)ZxT^Bg&&G|Ef9~=m?QF@!V@kM3`ROO;9m+{RKc7-g z`YHMc<-D!@t;%1b{HxV}MNj5=dNMDqC-di(|DK-DZ_)F46Fr~5rTm9<9iG&6=&9?l zQ8^=(|BUkUmG7&ceui)1C-3L9X&VxLC=kKvq@*7o0xvuFQNSO zGk+E3r=R?d%hv+(t({;E@*I|Ql9##Hi<&RN*M*Z|Rl&kb= z`g_W4df)W7l{~#~Wxa1>y>Au0Z@%)=-(@`Ir@zsZRet(=O(o@@)cK##`G28=JCvXP z*0WhT>F+*YD<}O8=!kNbDE}Sh|5N$()qhdf|4v>1tgipl%70VW|9V~jYP$ZfDgQoQ zhoQO-U34AZRn8FQKdJmjl>e)f{M6FlzjE|y`de5By>I%v*sXfsGJ4;7df!OzJ3{Z9 z{-$p=QP*L)a_&?9DCG}U{%KwROZ5GB zukxSP&$pUhZKn5qOZl%UznR|mnDQ?uf4%bC>wQD@FH_%E|3STPk#d$Q{~qNZQ%zmNw|2pB#{5QKDR$cHGt1EW4y5X%>ckE*Iz}u{z*wyNVw_Cljo7D&Ju=-+m zs~_HJ^~WC80KCf@h&`=A_(y9n_OgcH-PTa-Z4JYFtl`+l8i9G%NbGBk!arG~Im7u=UH))UaNp0cLnL~8~#A!Q*xZ!N;<)?)mJwUk$9pkuvYEyJ1Ca(vNRfwQcYy!sM4yvHhh*;x9Z=ve=>*5N#BJ)Kw3;r%w?0&5d4v^L|b))ri3ZN=BDZMfLlj!Uc^xYXK- zuUorunY9Psu=e6|YahO8?Z*|?0es6kh%2o___lQzS6N5#9qSmbwvOYw)(Ko=oy7O7 zQ@GYTjqh7$aGiA)3;7?scR1Jc_Oqh;F;=k4N$Rt7g)S^UTfaf=n>$5sj4 zYL&!KtkSs6DvO_5<#4-I9zU}x;ts1aer{F8omO?+W!1#p{LjTY))!V?++*e7msSJZ z%m3V|WBto&g!`<<_?6WJ_ghWzYpWR^u$p6$)dCM%E%6(xH6F6s;I~#=JZ!bYBUXDn zYIVSWTOIM3)d|0|I^%Jx3x02P#S>OH{EyWgPg*_j2dgKZvU=f$K+bnTIJ zJaoA3qgeasaP>#C4v-0HkHN?ui?KZpFR{mC33~!wYEQ(H_9Tukg$_TP$ymmoLZ>V; zSM8}-&Yp&s+tabUJ%d*(pu^8>CRVa%VP$(ZR8`*2{clKIrY_G$s?Dg2h z-hfxzo3N?98LzRoU^9Cw{@&h(&F$^@2YUy$uy^9M_HJxx@4;5~UTkge!|Uw**v3A9 zx%NS9Yahbv?Zep4K8iQk$FRM99B;HwU|~$CTkLb#**=fA z+83~keGzZ7ZHM`6yLh{u!ESaI@32GcZpV11T>^X9CGjr1H1@R1;vemD*vl@DciR=Q zw_O?Uv8!SqyE^9CHL;kUCf-fuU-fp$}Tz;1?v z?B@7qy9ExmTjGOuYaC*?!H4X&IMi;358Lf=nB4*YVt2&hb|-wq?u;YsF8HY36-V0L z@G-kPjKgC z!}eVK#GZ%S?D_bqy^vS8BXihZ#CiuZhwa6<(_V_Z>}9yyUXEYbD>!BkGKcMzxYu5V z|FT!p--pa$dkyRT$Q-uU;sJXdog!oo+w1WgdjlS_H_`tVnZx#GJYsL5a}=4w_Ey%% zkU4B`!{hdL{NCO{{{%9J?VWhi-i<%ld+?OK7k{+(am;CC4%_=#pF!rZeE`qe2k{sC z5T3IS^Xh+*Icy(g{VO`w1^XEO&puA)A~J`a6KFdp={U$7c21$^oTigO$MT&sth4A? zfpZo^=Nv}Pd5rn{ESba3MJ(a)fwwMoTrBBiu#}U<(oTqFoEXbGCGax-4ov2-QyMRK z%3^t^99D43V@0PTR&pw1Wv41uajIigrzTc&YGZY$F4k~zu%^=hYdH9od1P8<5aL*}s47O!&JVH2l4UhQ4R;ZzIeUU z58FBY@djrAws!{Njm{wK;0(r_oFVM(h|FPUD0Xs&;VsT^`kj$E?2N!J&Pcq?8HHV) z(RjNv2D>?9@eXGkc6Y|(oz4X8;Y`H4oJrWznT&sQreH5;D&Fl(!`{wxyvLb=eVm!R zV;(YxomqIVGaLIkbLjsGnZwRpyw9131DyGIzq1erI*afDXE6?Pmg1kCWjNSbjt@F3 zaEP-KA97aVP-ith?5x3I&RYD7vkr$l>+un11CDSu;iJxG9O-P~93DgFu(K5(cedeZ zXFLAY*@0u6otW?J#<9*Ge8Sm_2i zP77S^v}EtQ$ozL&<9kjUT$kghtH7baAyF1?hM48&LH}`kooTn z#xI;9xW^faUpm8ZuQMF~<&406&Pe>q8HM|u(fGA91`jx6vB(*R2c7ZwjWYocITP_) zXA&NECgTxj3h#Inng7mIJmyTp@0{uMk0bNnnSm#qnfM=P7M^rw;}6apJmt*AADwx4 z+L@0(ISbi)2ATiPB0TFX#$TMJc+Odd|8Z0RJ7oU5 zCGaY@B%LP6{C7*UZi>u*w=C;s$ozN9v2Kn$hr8vmg+6u` zaJM?^Tx9;cHSv14Hnwx?;tg&Nws#xgjc!Bi;5NdW+{Wzch|GVt3F}VC{CAsTXSW%h zTao$iHpkoC7IeBI^WSZW-Q3o6?m*_h+lKX>$ozNP;$3b#?CG}0Ke`=wwHGq~-Hxn# zBlF+wgniu3nCEuEzHV2%*X_nJ{gCHyw>$QCd*FR;Px=Fp`S12(JrJ4yZf_jq_M!7< zWd6H-@j-yMu2+#&d=JCy!N0OhNIl! z__#X)N4q2OukI+08H3D!cQos<$ozN5;5c_IKIx9b@$PtD{Tnj>-3hFpLgv3a5ubJ^ z(V2wIe|IuYcBjyJ2ATivRD9N*MrSJW{O?X@Jq?-v?hKsn&cuJXvv7tx8((ne;7oTe zzUa=wS?+v%$z6!E-9`AayBO!VOR>ORhI8HJ_)m8Q&U07dEAA?s@2gPi_Z1<95WK-A;Jc?To*;UGSXS760pY!}D%;{MGG&7u=rsKercNbbF)a z^+DU~i;mY1U9UfS-T=&a133pDng8A(47|Y@dP6YshGOgu!%Mv3Si&2DmwF?yq&JGa zrI7jWjm9$G7%c0J#ml^LSk4=dmwOX9vOF^Xy@^=Sn}n6T$ynK&f>pe!Sk;@xk=2m- z?@h-V-VChi&BR*XEUfL##yZ{{tn1Cidfq(D@#bTFZy`4D7U31%Vr=Lw#VfsK*vMN> z{_l|a@2$YAyp`C*TZLD9tFfuK2Cwnfa%3}P{(I}Nxwjtw;BCMb-X^@(+l(!}Egabj zng8Bayw2N(ZM^N6>+Qg{-cG#U+l}qKJ$Qq+7u$RL*n1-~|GoWqlXn0+dI#}l?+|wK z4&yD}QS9s;!&|-M*u^`6w|OVAt9J@-_fBIs?+o7IoyG3nIlR+5k3GB#c$aq(dwTrC z8tadqi@m%|*0%0Op8vfp-s6SX$BXIbA@koWf%kePv7c8O|Kyd${$4q}&nu4uyoz|g zR~ZL-Rq+9@Iu7z`;-9_RIM}O;4|+K`#A|>Lc@1%>*9af>8uO0BkooU5!Qoz0e8g); ze*`lBz2-R5Yk`k>Epe3B8Xx!C;ApQc{?%)TW4!j5?{#4BSY-Zt9dVr337_;j<9M$N z{>|%(6TEI5`4lq$z3%w5*8?YcJ@M~eFP!Z4#%H`fIK}IW&wBlEs@I>r&mqtM-T-{w z8;H}rLG=HD%ztk%zTgePnch%*(Hn-dyy5tgHv(sSBk^T#6wdKRV}UmY=XzuDpWZl} z=Z(i#ya_npn}`d%Nx0CPjIVlAaFI6^U-PEnVsAPw@n+ysZzjI(&BA5gY<$C;gUh|S z_?9=1vt5Zi^Lz7IuR>~Nz6_aWnWL;PN1kRg$FM@?IGu{fG|QY|T^X5XnUk!mB2TlKQ&>H7nobR5 znq|(gu7ymq%vsiTkZG1VhxIb&F(-2Y>t`-vgNz+8%`z@F%wz(dW|3)@$>Q%aA)Us^ zG|R-;BvS&f&XmNanbN#^4f0PjGG+1inR3`XQy%}2smQA>kZG2wj4d-&u~nuzw$9Y# z)$5RHmZ^=onYwh^BGW9BgY7a6@P4<;Kbi!Vl z&K!R?GR-nw@SaRpI(?9**-SU=o9T}CW_n=1Oiy0@6Ee**z3{$FZyb>6gZF3p^6Efj znq~UopiF=Kb7lYz&J5($2a#!(8H5jI2GbdeOtZ`o9F`f1f5{BP;hEw1NM;0%%#7s7 z$B@r&W)$m%$mcgRn)M>&^P3rii!)>CEI~fMnQ^RNM?Sxq@%Tn&0xr)?#5XgOa7AV^ zzLlARD>GB^?aVY>m6?w3WM<&%%uIYYGYi*bX5)LAIk+}67vIm!!*!YYSeRLe>obe+ zgUn*wkXecwGs|#OW;uSCS%I4~EAgYuD%_G;&3S%|e1FfZVf_j6{FYgZpJvwK_RM17-d`|rg z>#LE^sh?$i4e~klL;SrT(`k-;PW=+BTOglPza;CH$mi5AjjjE%c%5Gk+xX=%*RP0e z{mOW~UzOwAA)iyfI=1&~(zy}&ocgu#CciFr^mFiLzX7jyLO!Q{L+tD~!dv~u*u`(c ztG6MaQ@<(R?l;43esjFTZ^5hGkD+~UPW?9cN53uh^4sCvetYcgcffo6 zj@ZZVgn52v?CW>Id;PB1&+mqR^1EYyzX#su_rw8yFTCIHjRXBY_<-LR2l@T*&whU# z><_>P{ed{dAA}G2gK?-o1RwT?;xK<0{>2}T!~GHXh(8iX_@nSqe>9Ht$KYfBSRCb# z!^i#cING0pfAuHg7=IGx`;&33KLwxgr{Xw&8b0Yy$MOCQ{F^@$C-}4QDStLj^ylEy z{#=~o&%?j_^Kr7j5TEfE;S_%{KI<>Vss1v2&R>qx{1y1TzY?eWtMDKGYMkM(!593s zIMZK;FZ%0omcIdC@;BjZe>1-9Z^1eKRxI$h;aq<^{?p%q^ZcFoioYA@`+IPKzZVz! z`|wqNKQ8hQ;A{RtTL10|{bRVyKaOwsC-|*cj!Z58Bzereq5m*v$@kg4UD!%zM4xZSUapZS$}bq6xF{HnOqua3L? znz-Aq&8uG^Q_HW5U-~(8_99cuZ-D#!hWM4=2>1Jq@oT>c9`KuDk>3mt`pxkhzXcxh zTjIBVYdq|?!6SZKJnFZ@fBWt6nBM`v^E={kzY~7%cg7Qb7yOUk6;Jxz@CUy;p7ML( zkA6=)?f1f;{N8xR?}I=4eetZ{4}bCd<2io-{?{Lf=lwzWt3Mbo_(Sl2{!qN=4?`@2)2I~&Vo=iuepxmZ3s4=ZHnW5w)3tdw1Zm9vYnN_Ht$%`U@g z+2vS0y8>%uS7OcVDy)@VjkU9DuugU@*3GWNdfD}ulih&zvzxF%b~9d)-GU9XTk*>5 zHf)sLj=#(9z{c5~*fhJF--m0EX`kK0`uE6FS#~e$KOo;Rv-?*tXvl)Zre$X=u~1DQfu zJLcbgBU32rvYv%Zp=^frY-9>$vp6Rk(kVcuP&Q`$Ph<*ZOR#d<=wmdG*R>URQ%D6OJ6<^O*XV)@h3T11uUXDzmY;9bTtxM-E5%J7pW<>TDxA?;=wu+nDux$P~&p!S}OGab30<7G|6C>Uv}fWm~Y`fIK^8TjHi{ zYy2?V1~+Hh;z!wb9J2+PLfQ7XHQNC{$#$f_4VgmOPOP^hQz+XRcVxTJ`5c)-*{--N z+YNVTyVL&ynL^nf_+_>yoxR8u%JyQt51B&Q-nc*82fxntrGEgKLfL+JFxwx$$qv9n z*@5_Nb`ZxLMy619Fzchp6v__4W7(njU3M5A&kpC+?~y5#9l`oP$P~(s#2>Pw=$t~P zP!pb|U_oorD*%lktDqDR?nE6|Gmf*I%rGtmoXVJ4W3elQ2K!CVZ2c^C%sF$xx994tcq_5&;tEX7NMWmqy;j-`SX zSUOmVWr9^$Hdu|91#7Teuof>5)?xWzJyr-dV8vh)Rth#_jBs zw$rbHOrc;0)(UoF?O-?73HD&!U@z7S_F+!2AL|DPut9K;y;mSpC^&>y28Xdxa1?(R z9K*)Jal9%x!I4dnZ;Qc6Y#N-xYl73*EI5O|56)uq;2i!TIFBuY3wUjCk-aUEr_jK@ zgt-*BcwLaWgn##qJcR~XY#W4leGp^2pak9!l*INyX}mEgiyeY;cvDawI|dc;=Abfm z3aa8QL3QjL)WlnZ+Snzii?;DC1z@zG!ijtqw4W5F;S6%5D6gAp7#8hHv0M&g)Y6y^t`acnRKp9sd{xL_PdK8ZYq z2IKK>!33NTOvI;xNjNc>j86wsa8fW8{~k=k$-#7dCYXU!f|>YiFbk&!v+=oL4o(Z^ zlK(t1|ATq>k6=E|2o~ZC!6KX)EXEgur5rg6ng78uoEIE!77{^tmepn zBJ)33gRcZ@aelB47X<5ZVXy&T4L0GTU^BiJY{A9BR`xDI=6|paUk|q9vS0_k5$wd} z!ESsr*n=yAz4%tJ4_5~J@$KLMt_lv~JHa7b9UR7YgQK`6IEL>9$8l|N0^bi#;=14z z76zwreQ<_z_yBnd4bI}m;2drW&eQ)8ng78B{3y7HTLS)TbJoX!i(7*XeiCGHTM*)> zL5$mj68KqA5_bfp@$;Z8?hMM|uAn^b4l3doL1o+%RK+iY>Lr-}$ovm#;=Z6ZeihWE zzaN?ZK@J`W8emb-5Dx~8@SC799txV^w?R`p95lltL38#VMdp9d0*?hP@w=ck9uL~! z_d#1c5wzpT{~+@}XpcVx9q?4p5q}Ii;pw0={uFej_L1S}g)#LL1-ST3B5mxoiZd^i;=gwwEM zIGuB@gv|eN2J0%w{10ccu7=G2a2D$t$ovmyW36xwo!ZF!59hM3i_HIU9_t)r{)h8f zH$a|3!-d!|Ttw$eWd4VXS^o~1|KU>BS0VotB3#D$YGnS0%ki3U1vU#;;_t&%*gRZ~ ze+buLi*PMo8?IwlOJx3s>shx(=6|>W+k~6wFq+lSle+=$Ho za69Xpkoh0(z?;LJ*eTqNw}g9mwKFpR!@aD#AoD-mhh4+{czbvNyM+hwj_?r2bVvRv zM0gl`gh%nN@EHA`$ovnFv+jk=|L_F%4o}j#2burjDa;E`W8d%${d zN9KQcp7j7^{)ZQEV0aN92<=O4YY_5JAwm}ihZ%e@%;JzR#D~I|V}>I0KP@e^{RNW61muE8^o}Wjdpg`5#urF=2H&`N;eaYvL1OZ93zS z=l`%S>+#6^4|8xr*Z`jj8{)*U5k4I@#z|ol{Cn6GCx^}OnXoxd30vT^VN0AEw#Mhe zHaIP8i_eGcaC+Dt{}Fb;8DU3!A?$=R!_N3(*ac^WUGb%`8_o{9kj zD%_0w!!5ky*U0=2w_;Ja4G)If>3@UF|8NI>8}7uz;ch$gh%mYcnp6CkK?KE1pXMF#M9v^{3$$*XTmf1b9ffdhUYkkUy%79 zp2z=&7w~*|5q}N&ub5jGLKpuRX7FN|MTR)qQCyP$?kh6?qY~&vB{36~Mn5Wx*{B=_ zQF)FGk@+80#5k&qmqb;uL{uFwjcQ`as5VEILgs%|7t2IBST<^amqiV+T+|3Jj~Zk7 zs0mhxnqtMM8CHs#W96s?R*70-)u=UAi`roIs4e+5koh0A!&*^$tQ~d0I#EZg8+F2Z zQD=_KLFRwd1sgV;QDy|GEu2d|F$V$-M}Uc>)( zJo7&qfWMChV)JMad;fsU|7b8?8x6sh(NJs^4a3&aaJ()Wfo-CZm>Z44w$W(3J{p7V zqOo{GG!ENG=;ePo1-b%DVmD6MANWyG@Wy}6?y)TX5eknOzaxX zqJKLw|D)M>M>Ge!M|1JcXdd>6=Hp$_LhKnW!aqifu~)Pd?~ayX?`S#R6Rp5L(MrsV zR$k@+8O#zD~*{ByJw2S?lR!Du@U ziFV*a(M}v1?Z$_rJ?tHZ%>QUF4v+TXBhh{w5gousqk}jyI>eEWA@e^vjE_f0addPH z{~8^~G0_Rkk51y)=oCH?oyKv|8TLMjJpV^$@o&*NoDiL-{}eL+qYL-b}8n6 z`+oDzljY!u_vs02P2mBeXLX?#8^i_@cW_>ZVO&WI}F3sGg98CAs>qv|*- zs);W}wQ+V-7hjHYa8A?!3!;WNH)@3cj2h#-s0l8JnwH|30!7rn}xHsyD|BCwKzGwh`6%EAw(IEUf8jJ^` zAy^a*#e>l>&hr~&-bTY&e~Zl9XapXKM&i+E6#hFJjmM%f_+2y>k4NM1`)E9#h$i5F zqKSAinuI?@lkrqE1%HgD;^}A_{uE8eGtmtEIhu)QqgnV%G#k%FbMU{>Ts$Am!(XHM zcp+MdR=kKaw2}E1FJ@g4nQ!q@)|HX@7B6F66`61Ga;zS&pi={xZ}CdjwUGH1uVP&X znQ!rGtQW7LlY`8+crEJ&$b5^}v2KXWw|G4^iZ|fz;!W5%-i%kpTd+yI6|auBaePx` zzQx=d8ITjDd=IX;WG#^(I$FJRaB zBHkYJ|AETt7Q1*yoWbsK7VnHh>=DO!S6l*n#wGEOacS%om&Lo|a@adAkN3nCu}@qX z^Wv)5H?EHN#x=2DTpRxs*Tw#E4&E0xzyWbXygzP)1LMZ{K->fe#ZB?gaWfnoH^&F# z7C0nsi4VoCacJBIACBANu(%!mC2o(y;|};p+!05_o$%4PGmebA;A3%D92IxN$K&oe zI_`mgjeFvlxEJQfy>V>Z2cL-h;<&gUJ{kAN@$mrsTRada#DnmucrZ?khv3ukP@EJG z!@tMFadJEYpNU7}lz0?A8;{1R@fdtA9*fiBark^Z9;e3>@E`F+oDomL7vjk{GoFGk z##3=tJPlupr{nB+2EH86#5wUSEQn{9=Kqf^GT-7ktmh%mxA9!o^O0E>&%=fBd^)cp z&$sbH)~_MYxA7v@OOWT=crm^nFU4i?GJGRmj?3c}_-4EkSH!D0{w?JBHeQWy$7|@U zLY{BqwYWN7hwsMgaZS8|SKmYa`9{16-;X!rx_Ao~##?!HJu+|OZMY%cjvM10xGCPr zs~;lsHr|aN#e3*%LFR3|7q`ay@RN8yZi^4#r}07D9v{Nb;={NjK8l~m$8cwS9CyVh zaCdwXzlcxap7=C=8K1$u@mc&=d=B@;=kcrf0`8A5;@7cVhIt#iSQKaQV4THo;t&tT zF@77Dz{7D#JQA12qj6dMcU%sS#pUt4xFQ~pE93WZRXh<_$N$7N@nl>Ze~9bisW=CJ zj2qzTxFP-&H^MV<#d+_KR+1&#GjqH)h7d3op#)QeEz9QJ4i=VQ6l7brWRSr`UP;H& z#;aX^(({?$+A&;I5&&pgk(&ogt***#VrV68eEtWz7ndbJ6hp*DjJsvB%nTfv#? zTyU1!2F_OJgGyZhYSjlCl>uWl0M1bfm{vpJT$Kgqsa@b9Y6P6G3gDq?H+YyTfuB%g z;NfZ<{G_UYN2m+IBh_ATfw~AhN?i;tRF{CCQkTxbuGLT#ILIB;2S~ws=6NRQa2#k4B}VS zjqq*|zp8G6Zw2wI>Sp-4AbwTd0&Y{cA~_Glud3VN+d=%Qx*h&G5WlMKfbRhDtLjd$ zU)==`sJp>Ibq|=Rd%>ORK5$6g4-Tsbu*!n?RrMfz7l>a~4}l}M5|Io(3n?Go)S!;#bwP@Vy{@RXqn@q@D-& zsTaVD)r;U4)Jy1G0^(QI%iyKz74R3-tH>_{@vG`J_~jseRlN>gq2569OCWw#y$SxZ zdJDWty^Z|KAbwT71Aaxli{u&*zpCDYUkl<_)%)Oe>I3js)rZKh2l1@IiGF_=oBg@F8^?_#Jfy_^?_Depj6dKBC&d@2S<`qiPNK zM`|7TnCbxkSe*?%t~P*wqBem~sLkN_RX6yg+6w-uIv0FOZ3F*Ioew^(E&%^r^?}c* z4EPsn0DM*@wCFEE{HhuP|4L=S=hZIcKLGKoY6SdiRRCX9yTQLvCGaIR2L7!Y2VYhd z@PDfd!B^B?Z2u0#ud0i{zgHK7uc=GGe^8f#udBT2-E>KgEEbuIW$>N@Zpbv^jc>IQ7z1@WuuM({m#6Zo&{X5{aK_*Hca_<_0={C9O5 z_@TNT{10^pxL@4~M*1$WM&Avl^gUp$z89?1_ks2LesG3<0Bq0?f{pqiaHf73oTVQD zXX{5PQGxhX{TOKU<6x|xKt2b=uj(hkx%w$^o_-oUL_Y)0*Uy57>gT}2^z+~+^b6qO z`bF@Q`X%rP{W5r@eg#~hUj>iSuYn8o>tK_913X&434Thy1sGQ!I`T{Vc`@nvk0SEK|IH(ga(L>no1o8hm3l8gDU{;TSpVtL&m);HLbO{{MV_;s7 zg9TjyNA-o^ZoL;Q>WjdVz8Ea)OTaOGDY!>p29E2?!3li@SkYI4llm&~LVY!L_&Jbs zwY~=Yd3`N-k-iT3J`n$}uLr-NZvZdRH-cZ(H-VSxo55euw}6-FTfr~s+rZ29?cgu! zJHRXSo!~F&yTB{;-QX|ld%&yoz2KMiec;vle()>$0ZP0E#Q*CD!E5zH;IHV1kzWVm z|Mer__4-lp*YsoH4f=8L*Yy+NjrvLOYx*hhCjB({8~Pb+ZwB%I`dRQ6{T%pp{XBT9 zegXVV{UUgqehJOr0`dR)W$+vN74Q!ID)`&_HSkXTI`}*K4e&1gCiqSL7I?RQ8{6Ln zIaljm3Ph2RtVXz=^`81PAb zEcmDTIPfWbJosn&1n_BnBKYTe3HXd&I-lRng7|;E4E~oO{$HO2|0@vxuTO#h0L1_6 z)4;#hXCQeI#Q*D+@RvaRzdjTGGKl}zZSYq>&eeJ~_^Mum#g8F>2tw%^fvIH_4!!63*!Iv1@QMk{J-u4 z-`5!={|4g!^#J(qIzjRwi2v6^;C`J&5}7Q##_WQpK>WWM0qaZwtT(&C8Ky*P1Bm}O zWAK?E{@;v)vrPq5=0Z@Ly`V7{p%a6gtIfq=+FSz8HJ2iv2jc(DW$^hR{@+{<9%imU z@(B?CZ>|JCX|4i~Fjpf#62$+TYrvz-wMZ6%_|TAF*kreV{Sx#EXaKo za}#)+xfxt!ZUK)sw}L-wZbRn;5dUv(ho1=I|IHoX5_2cmV(tQ$n!8DD1@Zsp9{6$) z|8MREPd4`S>@+Wc8_bK~M)MN5$-E49nODHg z=2dWuc@69~uY*124REV@6FkSf1)gi(27Apr;5PFvc%FF=Jm0(zZZ{u*7nl#h&zb#T zpQ$+%|8Hu+jHy4A=Y}Bu-!y=OW+s@J*~oW-_~ z%|+mC=3?--%q8IM=2Gw*<}&aOb2<3i<_hpmb0zpY<|^o50^UH-q<^Tfjdsw}KCt+pzsMi2paYgMVo503R}Ug5NQB zfe)Lz!S9-T(0l~M|C@WkN6mfUADR2X$IJuZADaik$IU}%{t1ZxHxGl~H;;f%nn%Gu zHIIQ$na9CDGf#j|nc@=!gyaxWQc^%D{LHxgY1AN823I3gV3w+hQ4gS4(2Yk)Ei{?Lo z_r_(StP_=foa{73U4_@>zp{>bpUsOT+I3;x*DgKwLL!)l^`0`dQ5Ciu^0Hu$d5 z;J=s{e9xr8e>L;K_sx9p-^^j)2j+0_-^~%=hh_ozA7&xA-y97_@iAacd@PuXj{|Gt zLhv*S~cD-i!5p9Y%v3^0yYf^*_C!F1dP z&W%@t^Wrt&A@MqJe%t{b8lMdw7Hn(fANZ*_gZvl}{~r&4$Hocx>39e{F3y6B;$7hJ@d)^{aREFb-VHX#C2UUw z@&EA{xFjA2TjC11G`f^G42$j<`t|MB%;dwc`9CcY6|8{Y)3i*E+k$G3nT z@vY!zF^TV2NrZ(1HSoejx%j=@lnxnt-N#3WokN?$!_Zm+9HO`Ybrx^dYzwU!s zLXYC@pbL2`=-JU1YBum0;cY^@qikx7x802J=9AsgdxVG7j_`(!-MsT+H}9Dk<2?@} zyrW?^?^+n+Z3#BZp`_f`H`3A)l>%{+r9lF5lGY%BjJ8C5#lm<ocX{rP1h8Ta%D+OKYe}YbZQOmIg^{kU&-!a)siu)~F+21_ujcRHM~q-5T{5 z3c1#(t(?iXMpO_SZS}>sMjMlf^4eS>Q*MoRx*(f}ORogUM96TN&1zXRy3Cs|n=)VK z%$G%&2R`8pmV52xPGz~MERRb0LbjCjjT8o3PdzPKv7sFnLcoWU@QVj=nrHls90icM3T#l^bh(1i-{vcz9OL>KFlDuSq3r`NHGvP z+*U(EQOyL>AIMN3MIp8gLBb&UhI`Tl~7X0x4EWFk)8vhI%p- zB*j4bU1qKj7s>RyST*#7rQ=dq7mhIL9bsDg9D*Q7n0;P15N5tDQ$joLfiSjC!oYbO zA#UylNf7uro$XZVIBzUOZ0HT2OCbF&o(W+f)Xdukf`yZ?27SY(1YS2Ju_&t&-=Lt& z!nG0>qa&He3EaNi)D~XJ0-OJ7)XC0tT~s&n)Ce_ zB=`wu6bOsXNmz8=C=hDzbOT|ndEG!*Yu<>^4Vbr~#jch@?CcMOwdQTA#M=hbVCm!Z zmCGRz)|^wZ#IB!^M0fi31*0Hgt+}LPAUHWcVZ2QcWQ5o{2f|wO##Q148HUTZ&lA>~ z*A=p}m>KYUojU>aX9vdkMBNn*TO*4($>ca1v2&IduS@btk)-xyXJ#x{?oN`ys5D$C zcaK^o(4FBBkZj20Geg8SWb@gPv61#{iF3|C(#^4}h*+xLQCgoV4vrJA9x1BkYqLpi zFj|rM%&xw^voZs_viTt|>OWYtk+aC2q-{?oo0G%d!3skMi#RJBEG!-@;)rmNurS(p zR<=COVW}-Y7`2U#CInK;p<-bSnor8o+Cf?u?JN{&A-%%6D2WDrH$>}_a#uE=m+Edw zb|%GyzKKeOu_6I!aspjl7)+uygF{J_2uP28q@i|dd{owMPnuCTJ(f$NZhQQ7LlO-p zxpJl_JCZ~@v&B-muTUIJihZ2@5{exy_mw3{%Gs1pIKPhcX9=BcPeDYCxSZ&0q%4wi z2y8BL-A(nd(@8z>Z$>9ffnE2Ht@B+m)5MBx@!vrU(2V16JoS{lmWNhma~&?N-I>aCtIGbxHVrI zD2yh94EL07Po_wJuPtUqlJP=u*Hl7Beu{?-*V2%4l46O4cyMAzo|(n~keJCGq}81a zj1@UEcO}JTZy1xm%K4X2P;*>7fIQml&1_s!s^0krI;NWo|Y8Gg;tfhpqjGj zVqYF<=B5IV5mKk|g1sERl zE5a^sDVPqWX_Zr^RM>&f7Mti~u$w^q4j&MQ>#ReT8a&&SkoQu3sAe?A|#DyG3 zylx;IB%FjpfhUCaNa5pb@lIfgw3vA)0MTP#)M}w7oW+XeXAyeAr{X@j@W1ZbRi#@}c{HCJ4 zl_k>7q*R(N>dNGk95*|%xrkdg)tW3GBr-CVvz6)KglGHD5_jT@ws3eUj6?&OGHSUZ zl;e^d;~bQZU_62b#3I=zORE=DWX2{S!#uTe=r zZiw0YVNoeNl$WEU9Aj)XDW82G$Oy=7y`-3DpOQ@5vwLupa6b=4wl$wARyHO>b}QlF zQz~ckj!(bG6iyss+*v5>vZoD+g#EJ39(yIj?y>$d=VaObs?$H&>CeSeH{Dv>vqg7S zwl~I#B_AON?xWe;SH_Vn#+_O<8t#il?YZ2>LV2y6 zIoC|c2~H}vCSNXAx(b}?4o+(;4vmd)FKyFUdDBh?c_^8(3u#jl8Ka(p?f&zUVj-Fo zn7Rq;DF+hn$VP*l`lHp{h8c|pERN+lc8x}3qtTj)(J0~Lrg>?%bf-T*Zz@WJB6DLU zdVr`bkfL*{mS)(jRV1FILF`h~dgT@ZM}1-_H8*ZFJ+ZTozjJa$0=t-4_e4Bjje3T1j-BRgCGzF+o>>;-a6>A>$!Xbp)p>!N`fx;^qg)WXn0*AZT+Pv!^hun*oc$j zCPOvep3My93%KwpQ8;?YHAb;8+MN{laD8312+85{ubS>I;h2a#-9X)4SN09^1S1h^ zd+S0jZ%b1bw3$)ve-!fBOulcA+nD?0+PCB`a!XOT(vVYci8FmBUy@5P7v%yuJIH2b z_h`4>mx3b<&7Iaf?zM0s$`xFtlr6CV4ipQe!p`!6Vw)FrmxnU>lHEE>Y^eEiCQH=! zVc5YIPhIkrs!u~iy%e<#02zTUmS)*q#Fe7LSlK?iq6_2^76FwgO>Jiwh6`?Y`Rb}N zhNa(kyYS``u}_eo6Q!t9@<+p|tuorw|9N&tskz$@Gr4XaEFmempy>8jp4=d7PuMm& zA#wc|4VLM`onE4T%s8_sK_+j{IOU5xJX}Yq>IV@vN1O zI^FRJTQ34zt!n5A%gLp%Rvcj=IKotSHi0mCy>1{(DlZ|FfnilRn?RTdULz0&%IR8S zJ241?F-ywkLg#v8AvXUYp*y^e3&tmW7zj1FsCz%Wcf9L0kFDM9DkKQumz5xcGPo1EI&gNg(uyli&vYfCWL2P$QQ_?%q1+ z;xeoe3Dp#@8zk)Metd#%kl-@BZk6~ZS1oK0j8FP_AQM8QZ!B>W$Lp|_J7pY`Q}JKq6=w@(QKm*I_qF6R%IZy>mgpiktCK?$j+zuILA3}EW~zXkZ=HVNvtzZe8?He8wJ9$ z@+yH$_}rYBE_cl(l=^V0@Hqs+vI;fxN$k*G$A>JdAn=5})=5}ajxd0>APH?jLBKlm z#(}WTym6HTBSzo#Xdo;ruNz3km*d22D6V~ku6>@c%3O*il7!RpSp~w3@;&d3g8;wc zBsdL6SbyF)5H>E~(4ZS6tU9kdMZ7LE*0;|SX0X?tA}-rWZ^Aa{Oaft2c#}Xlr#hQJ z7!)U=gS~DbEC{C?2<`E@flw1~6m&WEx;g}cMpb2!Z}!d`jFKqF_l`4BPn6{w$Vn8P z)?Sr0k>aFHq>V)-;!ROM=}pmS#0_LpMPm<=#Zk0vH9C^p2J$OM!&X<=faTn?K+f|4 zUTw=RM8#+sHHaFdgCT{pDs<8(s{tCq*_B>#dPk^iEM2JYHM<5AQx z-D2V=*6hI2LQhr8K4mJW|EoIBmj0FTE=JM5tEOi%LASeM|F0W=V0Bz7DHMDhlYUpx1*_S%K zP>+w-3;kd%Hn>Grww;@2@fN7Z|67mJ7fgG;FGM>cJwjgjFtyWC<_ME+B1qXMby`|3~TE_x40}O*J)*wM|h?JtUo$ zsHtyC)ff=LN{gFk%%3|}lV0S4W*4-$V7UucxL}nF+Fh{T1)VPFazT#^dR?&H1v^|Y z?1Ity`RSxa@k@_JJ}F`s)To^eM_TDmhDKi2?f(5_y^l*(@<(AAif)P;rRnpc#wZfq zdC{zHoQVWg5=iTg!MD3an>- z?0dAPekOw=WL`uvzcp%TN~PvS^Y{-wYBW^W)L#2 zqOMmoEN~@$1bc}0eC$74KbQK6hS{jlHvWl0_1~<986uQIXVOSV=QhOYP7zK0NkfL| z#hI>3sRlbJ>GlN;ZpqqpYvO7)z>XD@mHA|hFN5Too4WW_ zS9aj+gzri0O7bfQ22SZ;x@_mpfx*_n!NHSwSwc^0PWP_tC^_*>Q@&5bH#BN$XDp~s z&8R0}H8s}GNH0pwND(yiY2kA!pB1SYnqU>5c0TL*bn@xq)5E8i&vrgL_zb6J%p{nQ zjiJ6?yqm*RBb{Xj^@ym^x*nMhb;p3Skmu8zwbGlh_AxJmdT$*J@lbHmRWV34)7a$%@>{_f{OS(nu z2+}RquBE|donB-^siVyY(^|#JlHWPFyI=#ZSV1>3>t|B|-DxxHhcGUpxyENS{VLMDJ#&VTB z2}EuQdW0-uNmvvTAU0tU3ARi@?5Vi;^co<-rvse=J+@QHRCY3-5Hb zxf~xZvGl&nr8am*DU?9ume@i&#fK1Y4hayO&`g5Ov{RZ+)g+*%wr-uOX{K8#vRY=! zXm`p#Tcu80r7k7eb|IaZ8P%n`&`VF)47;S3JrqKpT}g8!29sLi@WsmdeW@kHR;EX} zgcgxV0>mb?kYF>VS7djit0knKuGZ{h)D5R;Yv1W=j|Ho$k-n8ZswUmr=*FwpR_W5T z4SW4C_L5A21dc2cVv7{SSjNP{c40eYZn5i0zT0iSo$2k8{dS_{L*PiW5S!0-sas>Z z*H*EYc}1?$KY(6`rt?U!MHk4M`e94L~=xuDY^M=aX za<;p2$Wmscl7RIpfoMkT(+pT61J^@HSJ&b?I3yux5uYG}?NUDkJ0ujcUR0%W>t$-| zXr>)?5h~nUt(^=^k~+=?6iA(zRJLb2UBh}r$*z}lyHGo&(w#!>j7ay);1y#0iNr4W z^a`PN*``-DaDen{N{OwFV@MYwx7cZsY}obF!;RQdoYdK!ODvH&r)Ih&5{21{SZ3=% zchvbt)w%jg`|7-!rA|-sV@_hOqk5k#fx_My$^zyUllD(^eCsKTaSQ1A?s-Wd}mmJSEr^tR>to zQ(8iqnrJfLV3rU{%8o`^Q>2K7ln-$>J4g_XW_rhl%yQ9W63b311c{_Tnyo2rFGFn*a-3_DYnvHOcC9r^ zAph`|lBL9@=Q?dJqaqzm`#?G(B~cblO=@;DBfXrA8q=q$rl?`sp~am&-T8&9E3T84 zqhK%h!U-h9;q(9n$*t4pCd=1xE)HW3u5o>=4p)tFdU>V{O-q^<$qIp0h?Izw#M%Wq1$t&Ivb&ZIIvdey6fKB&QDD2k4*t7WE?fCKiX&~* zlREU=VrFz>Az%IWZO<^@>M7Nrm$G{6cw_eBjca=NS(N=@S#vm??%{Mw4(5>RuZZ}q z-DoaT*~qsQ(qhsSY?@Hze<5jHM~WO}c{42UrsC_zNrs)6tCEo;#R`9MS`Fd>r#A2Z^(zN=RCizx-Q)xKEFPob9+FR55&hE|=OXW%~ zY2w@Le5o@jlE+}e4OuCyWpS$YNC1@;VuwW3O_B2qLXVPy(O{VapsZj)?)6M z;c|Jjbo!DdL)r51SpVXI!pM@)f+b?tneC4_iORby>i7ty&pyoy?03m4E_zbBjW6(x zZ*WhE`PofsW=Ec{m}dDon5cCg@>8kFIQ$g3eTQ-VuhjT2N$c$Q?Kx;iv+ej=IQ5Cc zUyo`wbV*UPDOz!3U9{q&x~hV-j@NcX$MN|ZX&*w*^Z^`N<+ba4Rhtplf6xmz0VFwoB!g3rqaOSTgOJhzV3p zUpzY4A9b&9Ydz`Y$QSbC@A*P#NcLa4K7IXjgSE9o-+1ALH>qs+Yxo+xDZ~y8-=C%z zMSZIaMZV*{f$ud&Bm8=f?`YcJE_j>$$CAxQn|xq?{}cOf)&sm1l@@)1JNySW%&vZ( z>l`c>z4d&0f1@ti=iW?XP50FLsZA%A@)Q_qhJ%B z8;WfUn=1cTnD6m(u;u&v(`;I(RVyC}rJqiZH2N|!;n9XXNt~+TN6T1D%X0jazt8cG zB=!!<7@`&Yx{7v>(l0Vv?y*D^-A=!4KtrCDHZdQhujEOljDYm5^p%t?HvK%+E8D)7 zk&2?TY~42b{A315DWPo=vrk?r_rT|;)9dK^zl%I%Ovda(m#Nmtd^pfn%58}_0!9bg ze6%O0`Y~drNuRgTt`hAVp&dE<;N<^ofKLNzj Br^NsO diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.pdb b/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.pdb index 1eaadd23e29b9d1685d79dd83cc16436d756bcf6..896e41b0980de8be6bdce8384f09554296d8418c 100644 GIT binary patch literal 142220 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Μ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 literal 140892 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 A(EtDd diff --git a/packages/cultmath/unity/org.gamecult.cultmath/package.json b/packages/cultmath/unity/org.gamecult.cultmath/package.json index c09bf6bb..29c93763 100644 --- a/packages/cultmath/unity/org.gamecult.cultmath/package.json +++ b/packages/cultmath/unity/org.gamecult.cultmath/package.json @@ -1,7 +1,7 @@ { "name": "org.gamecult.cultmath", "displayName": "CultMath", - "version": "0.2.0", + "version": "0.2.1", "unity": "2021.3", "description": "Precompiled CultMath numeric primitives and matching HLSL semantics for GameCult Unity runtimes.", "license": "MPL-2.0", From 111b918ec06c5b96563cc970124be3442821ffcd Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 14 Sep 2026 18:04:04 +0200 Subject: [PATCH 09/94] Make CultMath normalize follow dxc and release 0.2.2 dxc 1.9.0.5402 lowers float2/3/4 normalize(x) to x * Rsqrt(Dot(x, x)), and DXIL.rst defines Rsqrt as 1 / sqrt(src). A zero vector normalizes to NaN and a NaN component poisons every component. CultMath divided by max(length, 1e-20), which returned 0 for a zero vector and a huge finite component beside a NaN one. - math.normalize(float2/3/4) is now value * (1 / sqrt(dot(value, value))). - The HLSL mirror drops cultmath_normalize and its epsilon constant: it now equals the normalize intrinsic, and nothing consumed it. - HlslSemanticsTests pins zero and NaN normalize, the rsqrt bit pattern, and zero length/distance. design.md states the rule and notes that DXIL.rst's Rsqrt special-value table is a copy of Round's. - GameCult.Geometry's iso-surface gave degenerate triangles (an inside vertex on the isovalue) a zero normal through the old epsilon. It now guards them explicitly, with a test. - quaternion normalize keeps its identity fallback: quaternion is not an HLSL type. - Bump to 0.2.2 and rebuild the tracked Unity DLL and pdb. Co-Authored-By: Claude Opus 5 --- packages/cultmath/README.md | 5 ++-- packages/cultmath/docs/design.md | 15 ++++++++---- packages/cultmath/shaders/CultMath.hlsl | 5 ---- .../cultmath/src/CultMath/CultMath.csproj | 2 +- packages/cultmath/src/CultMath/math.cs | 7 +++--- .../tests/CultMath.Tests/HlslMirrorTests.cs | 5 ++-- .../CultMath.Tests/HlslSemanticsTests.cs | 22 ++++++++++++++++++ .../HlslSourceCompatibilityTests.cs | 2 +- .../Runtime/Plugins/CultMath.dll | Bin 299008 -> 299008 bytes .../Runtime/Plugins/CultMath.pdb | Bin 142220 -> 142220 bytes .../Shaders/CultMath.hlsl | 5 ---- .../unity/org.gamecult.cultmath/package.json | 2 +- .../CultGeometryIsoSurface.cs | 4 +++- .../IsoSurfaceTests.cs | 17 ++++++++++++++ 14 files changed, 63 insertions(+), 28 deletions(-) diff --git a/packages/cultmath/README.md b/packages/cultmath/README.md index 0be46738..0f9a99fe 100644 --- a/packages/cultmath/README.md +++ b/packages/cultmath/README.md @@ -31,8 +31,7 @@ shader semantics. deterministic value-noise primitives - `shaders/CultMath.hlsl`, a canonical HLSL mirror include for shader-side parity. HLSL already owns `float2`, `float3`, and `float4`; the include - exposes `cultmath_*` functions for shared semantics, including CultMath's - safe `normalize` contract. + exposes `cultmath_*` functions for shared semantics HLSL does not provide. - `Voronoi.SampleTones`, a C# batch surface that calls the Rust `cultmath-core` native kernel when `cultmath_core` is available and falls back to the managed parity path otherwise. @@ -59,7 +58,7 @@ float grain = math.value_noise_bicubic(math.float2(12.0f, 3.5f)); ```hlsl #include "CultMath.hlsl" -float3 normal = cultmath_normalize(float3(0.25, 1.0, -0.1)); +float3 normal = normalize(float3(0.25, 1.0, -0.1)); float rim = cultmath_saturate(1.0 - dot(normal, float3(0.0, 0.0, -1.0))); float glow = cultmath_smoothstep(0.2, 1.0, rim); float grain = cultmath_value_noise_bicubic(float2(12.0, 3.5)); diff --git a/packages/cultmath/docs/design.md b/packages/cultmath/docs/design.md index ad8409fd..f43f48e2 100644 --- a/packages/cultmath/docs/design.md +++ b/packages/cultmath/docs/design.md @@ -60,6 +60,14 @@ That makes these HLSL rules, not options: zero; numeric to bool is `!= 0` (`fcmp une`, so NaN is true); bool to numeric is 0 or 1. DXIL leaves float-to-int undefined for NaN and out-of-range values, and so does C#; CultMath does not pin them. +- `normalize(x)` is `x * Rsqrt(Dot(x, x))`, which is how dxc lowers it, and + DXIL.rst defines `Rsqrt` as `1 / sqrt(src)`. A zero vector therefore + normalizes to NaN (`0 * inf`), and a NaN component makes every component NaN. + (The special-value table under `Rsqrt` in DXIL.rst is a copy of the `Round` + table and contradicts that definition, so CultMath follows the definition.) + `length` and `distance` are `Sqrt` of the summed squares, so a zero vector + gives 0. Callers that can meet zero-length vectors guard them before calling + `normalize`. - dxc demotes double `frac`, `exp`, `lerp`, and `floor` to float. CultMath's double overloads keep double precision instead: `frac(double)` is `x - floor(x)` in double. That is a deliberate divergence for CPU simulation @@ -75,9 +83,7 @@ GPU. Because `min`, `max`, and `saturate` return the non-NaN operand, some functions turn NaN or infinity into numbers: `smoothstep(a, a, a)` is 0; infinite inputs to `smoothstep` and the intercept helpers give numbers; the bezier, `smoothstep01`, and `smootherstep` functions return finite values for -NaN input; and `normalize((NaN, 2.41))` is `(NaN, 2.41e20)`, because the NaN -length is clamped to the epsilon and the other component is divided by it. -Callers that must detect bad data should check `isnan` before calling these +NaN input. Callers that must detect bad data should check `isnan` before calling these functions. Deferred until a consumer needs them: `float4x4`, `transpose`, `determinant`, @@ -115,8 +121,7 @@ itself: the test proves the composition in the text, not the intrinsic rules, which only `HlslSemanticsTests` pins. Where HLSL is silent, CultMath keeps its own decisions and does not defer to -Unity.Mathematics: `normalize` is safe (divides by `max(length, 1e-20)`), -`hash` returns float, and `Random` is CultMath's own xorshift32. Engine-shaped +Unity.Mathematics: `hash` returns float, and `Random` is CultMath's own xorshift32. Engine-shaped helpers that HLSL lacks (`float2x2.Rotate`, `float3x3.Euler`, `quaternion`, `snoise`) enter only when a consumer needs them, with their semantics stated in code. diff --git a/packages/cultmath/shaders/CultMath.hlsl b/packages/cultmath/shaders/CultMath.hlsl index 365705f5..afffb2c2 100644 --- a/packages/cultmath/shaders/CultMath.hlsl +++ b/packages/cultmath/shaders/CultMath.hlsl @@ -11,7 +11,6 @@ static const float CULTMATH_PI = 3.14159265358979323846; static const float CULTMATH_TAU = 6.28318530717958647692; static const float CULTMATH_HALF_PI = 1.57079632679489661923; -static const float CULTMATH_NORMALIZE_EPSILON = 1.0e-20; float cultmath_radians(float degrees_value) { return degrees_value * (CULTMATH_PI / 180.0); } float cultmath_degrees(float radians_value) { return radians_value * (180.0 / CULTMATH_PI); } @@ -171,10 +170,6 @@ float cultmath_distance(float2 left, float2 right) { return length(left - right) float cultmath_distance(float3 left, float3 right) { return length(left - right); } float cultmath_distance(float4 left, float4 right) { return length(left - right); } -float2 cultmath_normalize(float2 value) { return value / max(length(value), CULTMATH_NORMALIZE_EPSILON); } -float3 cultmath_normalize(float3 value) { return value / max(length(value), CULTMATH_NORMALIZE_EPSILON); } -float4 cultmath_normalize(float4 value) { return value / max(length(value), CULTMATH_NORMALIZE_EPSILON); } - float2 cultmath_reflect(float2 incident, float2 normal_value) { return incident - 2.0 * dot(normal_value, incident) * normal_value; diff --git a/packages/cultmath/src/CultMath/CultMath.csproj b/packages/cultmath/src/CultMath/CultMath.csproj index 1c2bfe24..efa883dd 100644 --- a/packages/cultmath/src/CultMath/CultMath.csproj +++ b/packages/cultmath/src/CultMath/CultMath.csproj @@ -8,7 +8,7 @@ CultMath CultMath GameCult.Math - 0.2.1 + 0.2.2 Clean-room C# math shaped for HLSL-style renderer code. GameCult README.md diff --git a/packages/cultmath/src/CultMath/math.cs b/packages/cultmath/src/CultMath/math.cs index f5c81095..7e8757ba 100644 --- a/packages/cultmath/src/CultMath/math.cs +++ b/packages/cultmath/src/CultMath/math.cs @@ -213,9 +213,10 @@ public static partial class math public static float distance(float3 left, float3 right) => length(left - right); public static float distance(float4 left, float4 right) => length(left - right); - public static float2 normalize(float2 value) => value / max(length(value), 1.0e-20f); - public static float3 normalize(float3 value) => value / max(length(value), 1.0e-20f); - public static float4 normalize(float4 value) => value / max(length(value), 1.0e-20f); + // dxc lowers normalize(x) to x * Rsqrt(Dot(x, x)), and DXIL Rsqrt is 1 / sqrt(src): a zero vector is 0 * inf = NaN. + public static float2 normalize(float2 value) => value * (1.0f / MathF.Sqrt(dot(value, value))); + public static float3 normalize(float3 value) => value * (1.0f / MathF.Sqrt(dot(value, value))); + public static float4 normalize(float4 value) => value * (1.0f / MathF.Sqrt(dot(value, value))); public static quaternion normalize(quaternion value) { var length = MathF.Sqrt(value.x * value.x + value.y * value.y + value.z * value.z + value.w * value.w); diff --git a/packages/cultmath/tests/CultMath.Tests/HlslMirrorTests.cs b/packages/cultmath/tests/CultMath.Tests/HlslMirrorTests.cs index 445ad255..818fa3ed 100644 --- a/packages/cultmath/tests/CultMath.Tests/HlslMirrorTests.cs +++ b/packages/cultmath/tests/CultMath.Tests/HlslMirrorTests.cs @@ -31,7 +31,6 @@ public sealed class HlslMirrorTests "cultmath_smootherstep", "cultmath_lengthsq", "cultmath_distance", - "cultmath_normalize", "cultmath_reflect", "cultmath_rotate", "cultmath_csum", @@ -54,8 +53,8 @@ public sealed class HlslMirrorTests Assert.Contains(symbol, include); } - Assert.Contains("CULTMATH_NORMALIZE_EPSILON", include); - Assert.Contains("max(length(value), CULTMATH_NORMALIZE_EPSILON)", include); + // HLSL's normalize intrinsic is the contract; a mirror copy would only restate it. + Assert.DoesNotContain("cultmath_normalize", include); } private static string GetCultMathRoot() diff --git a/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs b/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs index ac97f92f..665f2c02 100644 --- a/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs +++ b/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs @@ -187,6 +187,28 @@ public sealed class HlslSemanticsTests Assert.Equal(DoubleBits(-0.0), DoubleBits(math.max(-0.0, 0.0))); Assert.Equal(DoubleBits(0.0), DoubleBits(math.min(-0.0, 0.0))); + // dxc: normalize(x) is x * Rsqrt(Dot(x, x)); length and distance are Sqrt of the summed squares. + static bool AllNaN(float4 value) => + float.IsNaN(value.x) && float.IsNaN(value.y) && float.IsNaN(value.z) && float.IsNaN(value.w); + var n2 = math.normalize(float2.zero); + Assert.True(float.IsNaN(n2.x) && float.IsNaN(n2.y)); + var n3 = math.normalize(float3.zero); + Assert.True(float.IsNaN(n3.x) && float.IsNaN(n3.y) && float.IsNaN(n3.z)); + Assert.True(AllNaN(math.normalize(float4.zero))); + var nanX = math.normalize(new float2(float.NaN, 2.41f)); + Assert.True(float.IsNaN(nanX.x) && float.IsNaN(nanX.y)); + Assert.True(AllNaN(math.normalize(new float4(1.0f, float.NaN, 2.41f, 1.0f)))); + var skew = new float3(0.25f, 1.0f, -0.1f); + var inverseLength = 1.0f / MathF.Sqrt(skew.x * skew.x + skew.y * skew.y + skew.z * skew.z); + var normalized = math.normalize(skew); + Assert.Equal(Bits(skew.x * inverseLength), Bits(normalized.x)); + Assert.Equal(Bits(skew.y * inverseLength), Bits(normalized.y)); + Assert.Equal(Bits(skew.z * inverseLength), Bits(normalized.z)); + Assert.Equal(Bits(0.0f), Bits(math.length(float2.zero))); + Assert.Equal(Bits(0.0f), Bits(math.length(float3.zero))); + Assert.Equal(Bits(0.0f), Bits(math.length(float4.zero))); + Assert.Equal(Bits(0.0f), Bits(math.distance(new float3(1.0f, 2.0f, 3.0f), new float3(1.0f, 2.0f, 3.0f)))); + Assert.Equal(0, math.sign(float.NaN)); Assert.Equal(-1, math.sign(-0.5f)); Assert.Equal(new int3(-1, 0, 1), math.sign(new float3(-2.0f, 0.0f, 4.0f))); diff --git a/packages/cultmath/tests/CultMath.Tests/HlslSourceCompatibilityTests.cs b/packages/cultmath/tests/CultMath.Tests/HlslSourceCompatibilityTests.cs index ca4584c7..c6ece795 100644 --- a/packages/cultmath/tests/CultMath.Tests/HlslSourceCompatibilityTests.cs +++ b/packages/cultmath/tests/CultMath.Tests/HlslSourceCompatibilityTests.cs @@ -91,7 +91,7 @@ public sealed class HlslSourceCompatibilityTests } Assert.True(mismatches.Count == 0, $"{mismatches.Count} mismatches:{Environment.NewLine}{string.Join(Environment.NewLine, mismatches.Take(12))}"); - Assert.Equal(26, compared.Count); + Assert.Equal(25, compared.Count); } private static int Components(Type t) => t.GetFields().Count(f => f.FieldType == typeof(float) && !f.IsStatic); diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.dll b/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.dll index d3c4a62fa9d4b99e1c064d91904c32608a6df662..3cfc761833b884bc7c9906223f7124db65f46828 100644 GIT binary patch delta 3425 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 Ys>F2T@M)De#j<*GAf{TpYYdC}KTluauK)l5 diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.pdb b/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.pdb index 896e41b0980de8be6bdce8384f09554296d8418c..169a71177222918626f6f0725af26bfb959832cc 100644 GIT binary patch delta 1469 zcmZY7dsNe97zgloKNxHY1R}~s*@keUF@(f{II#Kx;Dr#Hd7h2rh-Ez?gzNjy)~#>7 z&RXZq*YB7)pfR7zUL3^E++r_DUD}fNqy5{PhdcWtc5V2iwz9P|jg?}jzV9*?Gc=Of zpRU-Kmy!qhtKOTLUu(k9>BgFuyOi&@hq% znyKd6*rJ$wZ7-Jh>>XL47M|q#uFnXfciG!3rxm3;Zb-FF0c>UC?&jQT{xHYGC4P8o zx1Ze0aPfLXFXfrNXSXFfZdl>GsijsSd(*P+)pxSjD9qA1t%SEq+$+<3f5ohl*W{cz z`}1Vol>EqFd#X>QCmw!nw711rG=66w?cA~6m1z|p2RYUZ9Ng$6S36l2?mY9Ws;kGO z*-|p8pFHm_d_1p?*KMkrcx7LqR_tZAlUCIy=N4Ye?0;}8`$GJtC*#E*y`W3Ta7k=0 zqAx?+1BM;~ZMwxyolwY<`IYGP7bT0L9vo_J+?XI5?udtmp{D-I*URkPgIQ6=l2 zHuW<4s@TzbH?df813XLAA};n(OA!?RIC+7HvzSfwb~dcpoHoKt^;zV5F63O_=ymrb+Dex z9OO?ADO@*Kgj`{xHE_pskrc8eTmP4A<8tu~7b&04R`|iC9t3P5)?<_ek^E->2QE3fRa$0hr&VP%b+9j z;1ILt(-23sbwC1o67ZmuX_OHqU?2+Mb7ql|SyWC8fQktG1>x`oQ3jR7<#2R0&conK z;(RzR!u1lUAqK(;;(VwTscns~n8w#cKd2{9EQW80vG6U?4;q;KB$IzfTnvptc#jC0 zh^wKQxENZP{1lU$hPwl`$pTF$G=G3UzTSJsDw~_pD3)tx=W1DY&`cO3)LhmrAM@bkO~aL*maA>I+V9wx%B1ln zE7EI{N@r!6);AI(9TYcjc61lr9U3p?il;7(wmm2r45}WuFm2`K^mzVd^+TPg|4-Yj zhsl!TMkh3fV^VCj8$?Rq^DKMW&Q;_=WRzGqBD#Oww5Um7oY*pxWak)Eu*7$=+(Fpu z_{c2crOvGdon2}ltdd!VY&j}Bu;}^tx*Sc-bIo&5s+nw3H zrc=^cBW;`wtlnRID`ONEbRQ@@zsid6kLyj%97`IQAD^p>3ZCm-RvKAXdHy=S*G84xQQDEQ%=Ex-6MHIsy0a5@ z6^;Pm%AQs{ou}qM?$(Jl7ClJ-^K|T#NI38-D@8yz{ zY$oDTMX8~KPtI(lIxNUn?vy-o7VAvD#@di`QYyEJCUp^bLC(|uL;E(;kT1~wi*+Fv zKcR9LK(PiHv_$MK9zs4~qSiPNyBJ<-3jwi$Ay$h7go`qQZGt!iGDc(`^+X7fDv+`1 zMa;X!7PbWkAr5TQ2Om;>egrZkJO7vLX0xdtHcEWgbKt#%x-~mEw9ZVgHDoCDKd0Y} zJ!G$@s;-cO--H(&!E%6fqjEj~-n&6ARt!h6Yv5P_RhL2@HUaXn0yyqL0Q6D~1X%*t zsbI-==%*c|WT(I=o4jU^kUvbSYn+I?48A&DNNoLB;!n+S&kdmsr417s@^G<>gZ^KT S8>xOHBwQGuY6Z@O!sI{SJ;9m) diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.hlsl b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.hlsl index 365705f5..afffb2c2 100644 --- a/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.hlsl +++ b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.hlsl @@ -11,7 +11,6 @@ static const float CULTMATH_PI = 3.14159265358979323846; static const float CULTMATH_TAU = 6.28318530717958647692; static const float CULTMATH_HALF_PI = 1.57079632679489661923; -static const float CULTMATH_NORMALIZE_EPSILON = 1.0e-20; float cultmath_radians(float degrees_value) { return degrees_value * (CULTMATH_PI / 180.0); } float cultmath_degrees(float radians_value) { return radians_value * (180.0 / CULTMATH_PI); } @@ -171,10 +170,6 @@ float cultmath_distance(float2 left, float2 right) { return length(left - right) float cultmath_distance(float3 left, float3 right) { return length(left - right); } float cultmath_distance(float4 left, float4 right) { return length(left - right); } -float2 cultmath_normalize(float2 value) { return value / max(length(value), CULTMATH_NORMALIZE_EPSILON); } -float3 cultmath_normalize(float3 value) { return value / max(length(value), CULTMATH_NORMALIZE_EPSILON); } -float4 cultmath_normalize(float4 value) { return value / max(length(value), CULTMATH_NORMALIZE_EPSILON); } - float2 cultmath_reflect(float2 incident, float2 normal_value) { return incident - 2.0 * dot(normal_value, incident) * normal_value; diff --git a/packages/cultmath/unity/org.gamecult.cultmath/package.json b/packages/cultmath/unity/org.gamecult.cultmath/package.json index 29c93763..9b13645b 100644 --- a/packages/cultmath/unity/org.gamecult.cultmath/package.json +++ b/packages/cultmath/unity/org.gamecult.cultmath/package.json @@ -1,7 +1,7 @@ { "name": "org.gamecult.cultmath", "displayName": "CultMath", - "version": "0.2.1", + "version": "0.2.2", "unity": "2021.3", "description": "Precompiled CultMath numeric primitives and matching HLSL semantics for GameCult Unity runtimes.", "license": "MPL-2.0", diff --git a/src/GameCult.Geometry/CultGeometryIsoSurface.cs b/src/GameCult.Geometry/CultGeometryIsoSurface.cs index 6fc9355c..583fdd87 100644 --- a/src/GameCult.Geometry/CultGeometryIsoSurface.cs +++ b/src/GameCult.Geometry/CultGeometryIsoSurface.cs @@ -172,7 +172,9 @@ namespace GameCult.Geometry normal = -normal; } - normal = math.normalize(normal); + // A degenerate triangle (an inside vertex exactly on the isovalue) has no area and gets a zero + // normal; normalize follows HLSL and would return NaN for it. + normal = math.dot(normal, normal) > 0f ? math.normalize(normal) : float3.zero; var firstIndex = (uint)(positions.Count / 3); Append(a, positions); Append(b, positions); diff --git a/tests/GameCult.Geometry.Tests/IsoSurfaceTests.cs b/tests/GameCult.Geometry.Tests/IsoSurfaceTests.cs index 90d5f7f6..63b794b3 100644 --- a/tests/GameCult.Geometry.Tests/IsoSurfaceTests.cs +++ b/tests/GameCult.Geometry.Tests/IsoSurfaceTests.cs @@ -47,6 +47,23 @@ namespace GameCult.Geometry.Tests } } + [Test] + public void Samples_on_the_isovalue_emit_finite_normals() + { + var samples = new float[2, 2, 2]; + for (var y = 0; y < 2; y++) + for (var z = 0; z < 2; z++) + { + samples[0, y, z] = 0f; + samples[1, y, z] = 1f; + } + + var mesh = CultGeometryIsoSurface.Extract(samples); + + mesh.TriangleCount.Should().BeGreaterThan(0); + mesh.Normals.Should().OnlyContain(value => float.IsFinite(value)); + } + [Test] public void Extraction_is_deterministic_and_applies_origin_and_cell_size() { From 0f2c1f04ef66a8b85c507747c508960ff1417ae0 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 14 Sep 2026 18:19:53 +0200 Subject: [PATCH 10/94] Add PCG integer hashes to CultMath and release 0.2.3 CultMath's hash is the shader-style frac(sin(x) * 43758.5453) and returns float. Unity.Mathematics' hash returned a well-mixed uint, and seeding from the float hash collapses: a 100x100 position grid gave 1625 distinct values in Aetheria's zone generator. - math.pcg(uint), pcg3d(int3/float2/float3), and pcg4d(int4/float4) follow Jarzynski and Olano, "Hash Functions for GPU Rendering" (JCGT 9(3), 2020). pcg3d and pcg4d are the paper's code from page 32. pcg is O'Neill's RXS-M-XS 32/32 output over one LCG step, with the constants checked against pcg-c's pcg_variants.h. - CultMath has no uint vectors, so pcg3d and pcg4d carry uint bit patterns in int3/int4. The float overloads hash IEEE-754 bits via the HLSL intrinsic asuint(float), which is new. pcg3d(float2) holds z at 0, the paper's route for 2 -> N inputs. - The HLSL mirror gains the same functions, written over scalar uints so the text compiles both in dxc 1.9.0.5402 (lib_6_3, HV 2021, clean) and in C#. HlslSourceCompatibilityTests now compares int and uint arguments and results by value; a wrong shift in the mirror's pcg4d gives 208 mismatches. - Known-answer vectors come from an independent Python transcription. pcg3d separates a 100x100 half-unit grid (the full int3). One component alone has one birthday collision there, as a 32-bit value can. The same grid on the integer lattice has none. - design.md states that the hashes are integer-exact in HLSL and on the CPU: dxc wraps uint multiply and add modulo 2^32, as C# unchecked does. - Bump to 0.2.3 and rebuild the tracked Unity DLL and pdb. Co-Authored-By: Claude Opus 5 --- packages/cultmath/docs/design.md | 12 ++++++ packages/cultmath/shaders/CultMath.hlsl | 32 +++++++++++++++ .../cultmath/src/CultMath/CultMath.csproj | 2 +- packages/cultmath/src/CultMath/math.cs | 37 ++++++++++++++++++ .../tests/CultMath.Tests/HlslMirrorTests.cs | 3 ++ .../CultMath.Tests/HlslSemanticsTests.cs | 5 +++ .../HlslSourceCompatibilityTests.cs | 29 ++++++++------ .../tests/CultMath.Tests/MathTests.cs | 35 +++++++++++++++++ .../Runtime/Plugins/CultMath.dll | Bin 299008 -> 299520 bytes .../Runtime/Plugins/CultMath.pdb | Bin 142220 -> 142636 bytes .../Shaders/CultMath.hlsl | 32 +++++++++++++++ .../unity/org.gamecult.cultmath/package.json | 2 +- 12 files changed, 176 insertions(+), 13 deletions(-) diff --git a/packages/cultmath/docs/design.md b/packages/cultmath/docs/design.md index f43f48e2..f5f5d5a5 100644 --- a/packages/cultmath/docs/design.md +++ b/packages/cultmath/docs/design.md @@ -120,6 +120,18 @@ compiled under `using static CultMath.math;`, so its intrinsics are C# `math` itself: the test proves the composition in the text, not the intrinsic rules, which only `HlslSemanticsTests` pins. +Integer hashing uses the PCG hashes from Jarzynski and Olano, "Hash Functions +for GPU Rendering" (JCGT 9(3), 2020): `pcg(uint)` is O'Neill's RXS-M-XS 32/32 +permutation over one LCG step, and `pcg3d`/`pcg4d` are the paper's (3 → 3) and +(4 → 4) hashes. They use only uint multiply, add, xor, and shifts. dxc wraps +uint multiply and add modulo 2^32 exactly as C# unchecked arithmetic does, so +they are integer-exact in HLSL and on the CPU, GPU included, unlike the +`sin`-based `hash`. CultMath has no uint vectors, so `pcg3d(int3)` and +`pcg4d(int4)` carry uint bit patterns in int components. The `float2`/`float3`/`float4` +overloads hash the IEEE-754 bits (`asuint`), so -0 and 0 hash differently. +`pcg3d(float2)` holds z at 0, which is the paper's route for (2 → N) inputs. +Seeds and other scalar uses take one output component. + Where HLSL is silent, CultMath keeps its own decisions and does not defer to Unity.Mathematics: `hash` returns float, and `Random` is CultMath's own xorshift32. Engine-shaped helpers that HLSL lacks (`float2x2.Rotate`, `float3x3.Euler`, `quaternion`, diff --git a/packages/cultmath/shaders/CultMath.hlsl b/packages/cultmath/shaders/CultMath.hlsl index afffb2c2..6179d45a 100644 --- a/packages/cultmath/shaders/CultMath.hlsl +++ b/packages/cultmath/shaders/CultMath.hlsl @@ -281,6 +281,38 @@ float cultmath_hash(float value) { return cultmath_frac(sin(value) * 43758.5453) float cultmath_hash(float2 value) { return cultmath_hash(dot(value, float2(127.1, 311.7))); } float cultmath_hash(float3 value) { return cultmath_hash(dot(value, float3(127.1, 311.7, 74.7))); } +// PCG hashes (Jarzynski and Olano, JCGT 2020), written over scalar uints so CultMath's int3/int4 carry the bits. +uint cultmath_pcg(uint value) +{ + uint state = value * 747796405u + 2891336453u; + uint word = ((state >> (int)((state >> 28) + 4)) ^ state) * 277803737u; + return (word >> 22) ^ word; +} + +int3 cultmath_pcg3d(int3 value) +{ + uint x = (uint)value.x * 1664525u + 1013904223u, y = (uint)value.y * 1664525u + 1013904223u, z = (uint)value.z * 1664525u + 1013904223u; + x += y * z; y += z * x; z += x * y; + x ^= x >> 16; y ^= y >> 16; z ^= z >> 16; + x += y * z; y += z * x; z += x * y; + return int3((int)x, (int)y, (int)z); +} + +int3 cultmath_pcg3d(float2 value) { return cultmath_pcg3d(float3(value, 0.0)); } +int3 cultmath_pcg3d(float3 value) { return cultmath_pcg3d(int3((int)asuint(value.x), (int)asuint(value.y), (int)asuint(value.z))); } + +int4 cultmath_pcg4d(int4 value) +{ + uint x = (uint)value.x * 1664525u + 1013904223u, y = (uint)value.y * 1664525u + 1013904223u; + uint z = (uint)value.z * 1664525u + 1013904223u, w = (uint)value.w * 1664525u + 1013904223u; + x += y * w; y += z * x; z += x * y; w += y * z; + x ^= x >> 16; y ^= y >> 16; z ^= z >> 16; w ^= w >> 16; + x += y * w; y += z * x; z += x * y; w += y * z; + return int4((int)x, (int)y, (int)z, (int)w); +} + +int4 cultmath_pcg4d(float4 value) { return cultmath_pcg4d(int4((int)asuint(value.x), (int)asuint(value.y), (int)asuint(value.z), (int)asuint(value.w))); } + float cultmath_value_noise(float2 position) { float2 cell = floor(position); diff --git a/packages/cultmath/src/CultMath/CultMath.csproj b/packages/cultmath/src/CultMath/CultMath.csproj index efa883dd..8474fc05 100644 --- a/packages/cultmath/src/CultMath/CultMath.csproj +++ b/packages/cultmath/src/CultMath/CultMath.csproj @@ -8,7 +8,7 @@ CultMath CultMath GameCult.Math - 0.2.2 + 0.2.3 Clean-room C# math shaped for HLSL-style renderer code. GameCult README.md diff --git a/packages/cultmath/src/CultMath/math.cs b/packages/cultmath/src/CultMath/math.cs index 7e8757ba..99b3c234 100644 --- a/packages/cultmath/src/CultMath/math.cs +++ b/packages/cultmath/src/CultMath/math.cs @@ -382,6 +382,43 @@ public static partial class math public static float hash(float2 value) => hash(dot(value, new float2(127.1f, 311.7f))); public static float hash(float3 value) => hash(dot(value, new float3(127.1f, 311.7f, 74.7f))); + public static uint asuint(float value) => (uint)BitConverter.SingleToInt32Bits(value); + + // PCG hashes from Jarzynski and Olano, "Hash Functions for GPU Rendering" (JCGT 9(3), 2020). Integer-only, so + // dxc and C# agree bit for bit. pcg3d/pcg4d carry uint bit patterns in int3/int4; float overloads hash IEEE bits. + public static uint pcg(uint value) + { + var state = value * 747796405u + 2891336453u; + var word = ((state >> (int)((state >> 28) + 4)) ^ state) * 277803737u; + return (word >> 22) ^ word; + } + + public static int3 pcg3d(int3 value) + { + uint x = (uint)value.x * 1664525u + 1013904223u, y = (uint)value.y * 1664525u + 1013904223u, z = (uint)value.z * 1664525u + 1013904223u; + x += y * z; y += z * x; z += x * y; + x ^= x >> 16; y ^= y >> 16; z ^= z >> 16; + x += y * z; y += z * x; z += x * y; + return new int3((int)x, (int)y, (int)z); + } + + // The paper hashes 2 -> N inputs through pcg3d with the unused component held constant. + public static int3 pcg3d(float2 value) => pcg3d(new float3(value, 0.0f)); + public static int3 pcg3d(float3 value) => pcg3d(new int3((int)asuint(value.x), (int)asuint(value.y), (int)asuint(value.z))); + + public static int4 pcg4d(int4 value) + { + uint x = (uint)value.x * 1664525u + 1013904223u, y = (uint)value.y * 1664525u + 1013904223u; + uint z = (uint)value.z * 1664525u + 1013904223u, w = (uint)value.w * 1664525u + 1013904223u; + x += y * w; y += z * x; z += x * y; w += y * z; + x ^= x >> 16; y ^= y >> 16; z ^= z >> 16; w ^= w >> 16; + x += y * w; y += z * x; z += x * y; w += y * z; + return new int4((int)x, (int)y, (int)z, (int)w); + } + + public static int4 pcg4d(float4 value) => + pcg4d(new int4((int)asuint(value.x), (int)asuint(value.y), (int)asuint(value.z), (int)asuint(value.w))); + public static float log(float value) => MathF.Log(value); public static float2 log(float2 value) => new(log(value.x), log(value.y)); public static float3 log(float3 value) => new(log(value.x), log(value.y), log(value.z)); diff --git a/packages/cultmath/tests/CultMath.Tests/HlslMirrorTests.cs b/packages/cultmath/tests/CultMath.Tests/HlslMirrorTests.cs index 818fa3ed..d73c6d7b 100644 --- a/packages/cultmath/tests/CultMath.Tests/HlslMirrorTests.cs +++ b/packages/cultmath/tests/CultMath.Tests/HlslMirrorTests.cs @@ -40,6 +40,9 @@ public sealed class HlslMirrorTests "cultmath_quadratic_bezier", "cultmath_cubic_bezier", "cultmath_hash", + "cultmath_pcg(uint", + "cultmath_pcg3d(int3", + "cultmath_pcg4d(int4", "cultmath_value_noise", "cultmath_snoise(float2", "cultmath_snoise(float3", diff --git a/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs b/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs index 665f2c02..954c4375 100644 --- a/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs +++ b/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs @@ -209,6 +209,11 @@ public sealed class HlslSemanticsTests Assert.Equal(Bits(0.0f), Bits(math.length(float4.zero))); Assert.Equal(Bits(0.0f), Bits(math.distance(new float3(1.0f, 2.0f, 3.0f), new float3(1.0f, 2.0f, 3.0f)))); + // asuint(float) reinterprets the IEEE-754 bits. + Assert.Equal(0x80000000u, math.asuint(-0.0f)); + Assert.Equal(0x3FC00000u, math.asuint(1.5f)); + Assert.Equal(0x7FC00000u, math.asuint(BitConverter.Int32BitsToSingle(0x7FC00000))); + Assert.Equal(0, math.sign(float.NaN)); Assert.Equal(-1, math.sign(-0.5f)); Assert.Equal(new int3(-1, 0, 1), math.sign(new float3(-2.0f, 0.0f, 4.0f))); diff --git a/packages/cultmath/tests/CultMath.Tests/HlslSourceCompatibilityTests.cs b/packages/cultmath/tests/CultMath.Tests/HlslSourceCompatibilityTests.cs index c6ece795..9426e4c8 100644 --- a/packages/cultmath/tests/CultMath.Tests/HlslSourceCompatibilityTests.cs +++ b/packages/cultmath/tests/CultMath.Tests/HlslSourceCompatibilityTests.cs @@ -78,26 +78,33 @@ public sealed class HlslSourceCompatibilityTests foreach (var input in cases) { var slot = 0; - var args = types.Select(t => t == typeof(float) ? (object)input(slot++) - : Activator.CreateInstance(t, Enumerable.Range(0, Components(t)).Select(_ => (object)input(slot++)).ToArray())!).ToArray(); - var expected = Floats(counterpart.Invoke(null, args)!); - var actual = Floats(mirror.Invoke(shader, args)!); - if (expected.Length != actual.Length || expected.Zip(actual).Any(p => !(float.IsNaN(p.First) && float.IsNaN(p.Second)) - && BitConverter.SingleToInt32Bits(p.First) != BitConverter.SingleToInt32Bits(p.Second))) + var args = types.Select(t => Scalars.Contains(t) ? Scalar(t, input(slot++)) + : Activator.CreateInstance(t, Components(t).Select(f => Scalar(f.FieldType, input(slot++))).ToArray())!).ToArray(); + var expected = Values(counterpart.Invoke(null, args)!); + var actual = Values(mirror.Invoke(shader, args)!); + if (expected.Length != actual.Length || expected.Zip(actual).Any(p => p.First is float a && p.Second is float b + ? !(float.IsNaN(a) && float.IsNaN(b)) && BitConverter.SingleToInt32Bits(a) != BitConverter.SingleToInt32Bits(b) + : !p.First.Equals(p.Second))) { - mismatches.Add($"{mirror.Name}({string.Join(", ", args.Select(a => string.Join(" ", Floats(a))))}): C# {string.Join(" ", expected)}, mirror {string.Join(" ", actual)}"); + mismatches.Add($"{mirror.Name}({string.Join(", ", args.Select(a => string.Join(" ", Values(a))))}): C# {string.Join(" ", expected)}, mirror {string.Join(" ", actual)}"); } } } Assert.True(mismatches.Count == 0, $"{mismatches.Count} mismatches:{Environment.NewLine}{string.Join(Environment.NewLine, mismatches.Take(12))}"); - Assert.Equal(25, compared.Count); + Assert.Equal(28, compared.Count); } - private static int Components(Type t) => t.GetFields().Count(f => f.FieldType == typeof(float) && !f.IsStatic); + // Integer arguments take the bit pattern of the float input, so specials become 0, 0x80000000, NaN bits, ... + private static readonly Type[] Scalars = { typeof(float), typeof(int), typeof(uint) }; - private static float[] Floats(object value) => value is float f ? new[] { f } - : value.GetType().GetFields().Where(field => field.FieldType == typeof(float) && !field.IsStatic).Select(field => (float)field.GetValue(value)!).ToArray(); + private static object Scalar(Type t, float f) => t == typeof(float) ? f + : t == typeof(int) ? BitConverter.SingleToInt32Bits(f) : (object)(uint)BitConverter.SingleToInt32Bits(f); + + private static FieldInfo[] Components(Type t) => t.GetFields().Where(f => !f.IsStatic && Scalars.Contains(f.FieldType)).ToArray(); + + private static object[] Values(object value) => Scalars.Contains(value.GetType()) ? new[] { value } + : Components(value.GetType()).Select(field => field.GetValue(value)!).ToArray(); ///

The documented HLSL-to-C# transformations, and nothing else. internal static string TransformHlslToCSharp(string hlsl) diff --git a/packages/cultmath/tests/CultMath.Tests/MathTests.cs b/packages/cultmath/tests/CultMath.Tests/MathTests.cs index de1bf996..534ec276 100644 --- a/packages/cultmath/tests/CultMath.Tests/MathTests.cs +++ b/packages/cultmath/tests/CultMath.Tests/MathTests.cs @@ -12,6 +12,41 @@ public sealed class MathTests Assert.Equal(0.75f, math.frac(-1.25f)); } + // Expected values come from a Python transcription of the paper's pcg3d/pcg4d (JCGT 9(3) 2020, p. 32) and + // O'Neill's pcg_output_rxs_m_xs_32_32 with PCG_DEFAULT_MULTIPLIER_32/INCREMENT_32, independent of this code. + [Fact] + public void PcgHashesMatchReferenceTranscription() + { + static int3 U3(uint x, uint y, uint z) => new((int)x, (int)y, (int)z); + static int4 U4(uint x, uint y, uint z, uint w) => new((int)x, (int)y, (int)z, (int)w); + + Assert.Equal(0x07BB2FE2u, math.pcg(0u)); + Assert.Equal(0xA8BEEA3Cu, math.pcg(1u)); + Assert.Equal(0x995312E1u, math.pcg(0x12345678u)); + Assert.Equal(0xE62A4902u, math.pcg(0xFFFFFFFFu)); + Assert.Equal(U3(0x9BAFD7C6u, 0xA8E88A6Bu, 0x3F15482Cu), math.pcg3d(new int3(0, 0, 0))); + Assert.Equal(U3(0xFA9F79A6u, 0x48F2F44Cu, 0x596F5AB1u), math.pcg3d(new int3(1, 2, 3))); + Assert.Equal(U3(0x67DCF282u, 0x49E87E17u, 0x10018917u), math.pcg3d(U3(0xFFFFFFFFu, 0x80000000u, 0x7FFFFFFFu))); + Assert.Equal(U4(0x0F02F829u, 0x2D568769u, 0x32B0C43Bu, 0xD32548EAu), math.pcg4d(new int4(0, 0, 0, 0))); + Assert.Equal(U4(0x3622CD16u, 0xF11471D8u, 0xE1109B3Fu, 0x02B94C2Fu), math.pcg4d(new int4(1, 2, 3, 4))); + Assert.Equal(U4(0x72180037u, 0x81D493E6u, 0xD9BA7226u, 0x14C9ABA7u), math.pcg4d(U4(0xFFFFFFFFu, 0x80000000u, 0x7FFFFFFFu, 0xDEADBEEFu))); + Assert.Equal(U3(0xA7B40FEEu, 0x9B70DFC0u, 0x3106C2C5u), math.pcg3d(new float3(1.5f, -2.25f, 1e7f))); + Assert.Equal(U3(0x5A09E5C6u, 0x53EC0DABu, 0x4BE4A1ECu), math.pcg3d(new float2(3.0f, 4.0f))); + Assert.Equal(U4(0x1849E380u, 0xF199DEE0u, 0x6C6B4934u, 0x34AF16DFu), + math.pcg4d(new float4(-0.0f, BitConverter.Int32BitsToSingle(0x7FC00000), 0.5f, 1e-7f))); + } + + [Fact] + public void Pcg3dSeparatesAPositionGrid() + { + // A single 32-bit component is subject to birthday collisions (x has one here); the full output is distinct. + var hashes = new HashSet(); + for (var i = 0; i < 100; i++) + for (var j = 0; j < 100; j++) + hashes.Add(math.pcg3d(new float2(i * 0.5f - 25.0f, j * 0.5f - 25.0f))); + Assert.Equal(10000, hashes.Count); + } + [Fact] public void VectorOperationsAreComponentWise() { diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.dll b/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.dll index 3cfc761833b884bc7c9906223f7124db65f46828..ef93b69b20adc6df666aeba9ce5c4260ce5ba947 100644 GIT binary patch literal 299520 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
HC9-xypJnAZE9fM&DJzk66M8=> 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 F_#bgdYnlK6 literal 299008 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 diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.pdb b/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.pdb index 169a71177222918626f6f0725af26bfb959832cc..0bc1d4149c2ad9e666db32e4dddbf835313c3175 100644 GIT binary patch delta 23115 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 F{|8_X3_bt= diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.hlsl b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.hlsl index afffb2c2..6179d45a 100644 --- a/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.hlsl +++ b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.hlsl @@ -281,6 +281,38 @@ float cultmath_hash(float value) { return cultmath_frac(sin(value) * 43758.5453) float cultmath_hash(float2 value) { return cultmath_hash(dot(value, float2(127.1, 311.7))); } float cultmath_hash(float3 value) { return cultmath_hash(dot(value, float3(127.1, 311.7, 74.7))); } +// PCG hashes (Jarzynski and Olano, JCGT 2020), written over scalar uints so CultMath's int3/int4 carry the bits. +uint cultmath_pcg(uint value) +{ + uint state = value * 747796405u + 2891336453u; + uint word = ((state >> (int)((state >> 28) + 4)) ^ state) * 277803737u; + return (word >> 22) ^ word; +} + +int3 cultmath_pcg3d(int3 value) +{ + uint x = (uint)value.x * 1664525u + 1013904223u, y = (uint)value.y * 1664525u + 1013904223u, z = (uint)value.z * 1664525u + 1013904223u; + x += y * z; y += z * x; z += x * y; + x ^= x >> 16; y ^= y >> 16; z ^= z >> 16; + x += y * z; y += z * x; z += x * y; + return int3((int)x, (int)y, (int)z); +} + +int3 cultmath_pcg3d(float2 value) { return cultmath_pcg3d(float3(value, 0.0)); } +int3 cultmath_pcg3d(float3 value) { return cultmath_pcg3d(int3((int)asuint(value.x), (int)asuint(value.y), (int)asuint(value.z))); } + +int4 cultmath_pcg4d(int4 value) +{ + uint x = (uint)value.x * 1664525u + 1013904223u, y = (uint)value.y * 1664525u + 1013904223u; + uint z = (uint)value.z * 1664525u + 1013904223u, w = (uint)value.w * 1664525u + 1013904223u; + x += y * w; y += z * x; z += x * y; w += y * z; + x ^= x >> 16; y ^= y >> 16; z ^= z >> 16; w ^= w >> 16; + x += y * w; y += z * x; z += x * y; w += y * z; + return int4((int)x, (int)y, (int)z, (int)w); +} + +int4 cultmath_pcg4d(float4 value) { return cultmath_pcg4d(int4((int)asuint(value.x), (int)asuint(value.y), (int)asuint(value.z), (int)asuint(value.w))); } + float cultmath_value_noise(float2 position) { float2 cell = floor(position); diff --git a/packages/cultmath/unity/org.gamecult.cultmath/package.json b/packages/cultmath/unity/org.gamecult.cultmath/package.json index 9b13645b..6ab136b4 100644 --- a/packages/cultmath/unity/org.gamecult.cultmath/package.json +++ b/packages/cultmath/unity/org.gamecult.cultmath/package.json @@ -1,7 +1,7 @@ { "name": "org.gamecult.cultmath", "displayName": "CultMath", - "version": "0.2.2", + "version": "0.2.3", "unity": "2021.3", "description": "Precompiled CultMath numeric primitives and matching HLSL semantics for GameCult Unity runtimes.", "license": "MPL-2.0", From 452f928bb72534181f9d037d2b8bfe7addfeb2a6 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 14 Sep 2026 21:01:07 +0200 Subject: [PATCH 11/94] Write an unset CultRecordRef as nil and read it back unset The formatter wrote default(CultRecordRef) as nil but read nil back as "", so re-upserting a loaded record changed its bytes (0xC0 became 0xA0). One in-memory unset value: CultRecordKey.Value is never null, so default(CultRecordRef) equals a ref built from "". One wire form: an empty key writes nil, and nil or a legacy "" reads back as default. Load then save is byte-stable; a store holding "" converges to nil on its next save. Rust, TypeScript and Python have no reference type: a reference member is a string in the consumer's own payload, so there is no sibling codec to align. The store-composition contract now names nil as the one unset wire form. The new test loads a record with an unset ref through a fresh cache, re-upserts and flushes, and requires identical payload bytes; it fails on the old formatter. Co-Authored-By: Claude Opus 5 --- .../CultRecordRefFormatter.cs | 9 ++-- .../Contracts/cultcache-store-composition.md | 11 ++++ src/GameCult.Caching/CultDocumentContracts.cs | 7 ++- src/GameCult.Caching/CultInspectorModel.cs | 4 +- .../SerializationOptionsTests.cs | 51 +++++++++++++++++++ 5 files changed, 75 insertions(+), 7 deletions(-) diff --git a/src/GameCult.Caching.MessagePack/CultRecordRefFormatter.cs b/src/GameCult.Caching.MessagePack/CultRecordRefFormatter.cs index a5f984fc..1aa0968f 100644 --- a/src/GameCult.Caching.MessagePack/CultRecordRefFormatter.cs +++ b/src/GameCult.Caching.MessagePack/CultRecordRefFormatter.cs @@ -3,16 +3,19 @@ using MessagePack.Formatters; namespace GameCult.Caching; +// An unset reference (the empty key) is nil on the wire and default(CultRecordRef) in memory; a "" read from older +// stores is the same unset reference, so load then save is byte-stable. public sealed class CultRecordRefFormatter : IMessagePackFormatter> { public void Serialize(ref MessagePackWriter writer, CultRecordRef value, MessagePackSerializerOptions options) { - options.Resolver.GetFormatterWithVerify().Serialize(ref writer, value.Key.Value, options); + if (value.Key.Value.Length == 0) writer.WriteNil(); + else writer.Write(value.Key.Value); } public CultRecordRef Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { - var key = options.Resolver.GetFormatterWithVerify().Deserialize(ref reader, options) ?? string.Empty; - return new CultRecordRef(new CultRecordKey(key)); + var key = reader.TryReadNil() ? null : reader.ReadString(); + return string.IsNullOrEmpty(key) ? default : new CultRecordRef(new CultRecordKey(key!)); } } diff --git a/src/GameCult.Caching/Contracts/cultcache-store-composition.md b/src/GameCult.Caching/Contracts/cultcache-store-composition.md index 8c4fc529..b24c83b3 100644 --- a/src/GameCult.Caching/Contracts/cultcache-store-composition.md +++ b/src/GameCult.Caching/Contracts/cultcache-store-composition.md @@ -236,6 +236,17 @@ another runtime need not obey the `storedAt` rule. - Deserialization runs under untrusted-data security. `CultRecordRef` is a permitted dictionary key, compared by its key string. +## Record references + +A record reference is its target's key string. An unset reference, the empty +key, is **nil** on the wire, never `""`. A reader takes nil and `""` as the same +unset reference and writes it back as nil, so loading and re-saving an unchanged +record is byte-stable. In C# the unset reference is `default(CultRecordRef)`, +equal to one built from `""`; `CultRecordKey.Value` is never null. Rust, +TypeScript and Python have no reference type: a reference member is a string in +the consumer's own payload value, so a consumer writes an unset one as its +language's null (`null`, `None`, `Option::None`), not as an empty string. + ## Value-type encoding Vector-like value types (Unity.Mathematics, consumer structs) encode as diff --git a/src/GameCult.Caching/CultDocumentContracts.cs b/src/GameCult.Caching/CultDocumentContracts.cs index 0d4f1643..442f5c4f 100644 --- a/src/GameCult.Caching/CultDocumentContracts.cs +++ b/src/GameCult.Caching/CultDocumentContracts.cs @@ -57,12 +57,15 @@ namespace GameCult.Caching public readonly struct CultRecordKey : IEquatable { + private readonly string? _value; + public CultRecordKey(string value) { - Value = value ?? string.Empty; + _value = value; } - public string Value { get; } + // Never null: default(CultRecordKey) and new CultRecordKey("") are one empty key. + public string Value => _value ?? string.Empty; public override string ToString() => Value; diff --git a/src/GameCult.Caching/CultInspectorModel.cs b/src/GameCult.Caching/CultInspectorModel.cs index f40d9055..c457031f 100644 --- a/src/GameCult.Caching/CultInspectorModel.cs +++ b/src/GameCult.Caching/CultInspectorModel.cs @@ -305,7 +305,7 @@ namespace GameCult.Caching return string.IsNullOrWhiteSpace(name) ? record.Key.Value : name!; } - // The key a CultRecordRef holds; null and "" are both the empty key. + // The key a CultRecordRef holds; "" when unset. public static string RecordKey(object? recordRef) => (recordRef as ICultRecordRef)?.Key.Value ?? string.Empty; public CultInspectorShape ShapeOf(Type type) @@ -464,7 +464,7 @@ namespace GameCult.Caching } } - // A key is taken when another serializes the same (a CultRecordRef by its key string, null and "" alike) or when + // A key is taken when another serializes the same (a CultRecordRef by its key string) or when // the rebuilt dictionary type's default comparer calls them equal (0.0 and -0.0 serialize apart but are one double key). private bool Taken(Type documentType, CultInspectorShape dictionary, object key, IEnumerable keys) { diff --git a/tests/GameCult.Caching.Tests/SerializationOptionsTests.cs b/tests/GameCult.Caching.Tests/SerializationOptionsTests.cs index 7127f574..ff17d598 100644 --- a/tests/GameCult.Caching.Tests/SerializationOptionsTests.cs +++ b/tests/GameCult.Caching.Tests/SerializationOptionsTests.cs @@ -38,6 +38,48 @@ namespace GameCult.Caching.Tests Assert.That(Convert.ToHexString(payload), Is.EqualTo(InteropNotePayloadHex)); } + [Test] + public async Task UnsetRefReloadsAndResavesByteIdentical() + { + var path = Path.Combine(Path.GetTempPath(), $"cultlib-unsetref-{Guid.NewGuid():N}.cc"); + var registry = CultDocumentRegistry.ForTypes(new[] { typeof(UnsetRefHolder) }); + byte[] Payload() => CultDocumentMessagePackSerialization.DeserializeSnapshot(File.ReadAllBytes(path)).Records.Single().Payload; + try + { + using (var seed = new CultCache(registry)) + { + seed.AddBackingStore(new SingleFileMessagePackBackingStore(path)); + await seed.UpsertAsync(typeof(UnsetRefHolder), new UnsetRefHolder { Name = "holder", Set = new CultRecordRef(new CultRecordKey("other")) }, + new CultRecordKey("holder")); + await seed.FlushAsync(); + } + + var written = Payload(); + CultRecordRef unset; + using (var reopened = new CultCache(registry)) + { + reopened.AddBackingStore(new SingleFileMessagePackBackingStore(path)); + await reopened.PullAllBackingStoresAsync(); + var loaded = reopened.Get(new CultRecordKey("holder"))!; + unset = loaded.Unset; + await reopened.UpsertAsync(typeof(UnsetRefHolder), loaded, new CultRecordKey("holder")); + await reopened.FlushAsync(); + } + + Assert.That(Payload(), Is.EqualTo(written), "an unset reference loads and re-saves byte-identical"); + Assert.That(unset, Is.EqualTo(default(CultRecordRef))); + Assert.That(unset.Key, Is.EqualTo(new CultRecordKey("")), "default and \"\" are one empty key"); + var legacy = MessagePackSerializer.Serialize("", CultDocumentMessagePackSerialization.Options); + var read = MessagePackSerializer.Deserialize>(legacy, CultDocumentMessagePackSerialization.Options); + Assert.That(MessagePackSerializer.Serialize(read, CultDocumentMessagePackSerialization.Options), Is.EqualTo(new[] { MessagePackCode.Nil }), + "a \"\" reference reads as unset and writes nil"); + } + finally + { + if (File.Exists(path)) File.Delete(path); + } + } + [Test] public async Task RefKeyedDictionaryRoundTrips() { @@ -171,5 +213,14 @@ namespace GameCult.Caching.Tests [Key(0)] [CultName] public string Name = string.Empty; [Key(1)] public Dictionary, float> Weights = new(); } + + [CultDocument("tests.unset_ref_holder", "tests.unset_ref_holder.v1")] + [MessagePackObject] + public sealed class UnsetRefHolder + { + [Key(0)] [CultName] public string Name = string.Empty; + [Key(1)] public CultRecordRef Unset; + [Key(2)] public CultRecordRef Set; + } } } From 90e7dbee2782004c99ffd58f63b9f240971f2049 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 14 Sep 2026 21:01:22 +0200 Subject: [PATCH 12/94] Give inspector drawers the record they sit in, read-only A drawer saw only its value; Aetheria's schematic-shape drawer needs sibling members of the owning document (texture path, aspect, hull tints). The model owns the seam: CultInspectorEdit.Record is a second copy of the stored document as the edit began, cloned on first read and kept for the edit. The Studio lowers it as CultInspector.Record, so a runtime CultUI panel gets the same seam from the same edit. The Draw signature is unchanged, so existing drawers keep compiling. Why not hand drawers the edit copy the Studio already draws: that copy is what Commit upserts, so a write through it would be saved without passing through the returned value, GUI.changed, or read-only metadata. The record copy is read by nothing, so writing to it saves nothing and changes neither the edit nor the cache. It does not show edits other drawers made earlier in the same frame. The Studio's separate document-type field collapses into the held edit. Co-Authored-By: Claude Opus 5 --- src/GameCult.Caching/CultInspectorModel.cs | 15 +++++++++++++-- .../Caching/Editor/CultCacheStudioDrawers.cs | 13 ++++++++----- src/GameCult.Unity/Assets/Caching/README.md | 9 +++++++++ .../CultInspectorModelTests.cs | 5 +++++ 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/GameCult.Caching/CultInspectorModel.cs b/src/GameCult.Caching/CultInspectorModel.cs index c457031f..aaa7bbaf 100644 --- a/src/GameCult.Caching/CultInspectorModel.cs +++ b/src/GameCult.Caching/CultInspectorModel.cs @@ -238,14 +238,24 @@ namespace GameCult.Caching // A private copy of one stored document. A lowering draws into Document; the cached object is never touched. public sealed class CultInspectorEdit { - internal CultInspectorEdit(CultStoredDocument source, object document) + private readonly Func _snapshot; + private object? _record; + + internal CultInspectorEdit(CultStoredDocument source, object document, Func snapshot) { Source = source; Document = document; + _snapshot = snapshot; } public CultStoredDocument Source { get; } public object Document { get; } + + // The record being drawn, as stored when this edit began, for drawers that read the document they sit in. It is a + // second copy, made on first read: not the cached object, and not Document, which a lowering commits. Nothing + // reads it back, so writing to it saves nothing and changes neither the edit nor the cache. + public object Record => _record ??= _snapshot(); + public bool IsSpent { get; private set; } public bool IsFor(CultStoredDocument record) => !IsSpent && ReferenceEquals(Source, record); @@ -342,7 +352,8 @@ namespace GameCult.Caching public CultInspectorEdit BeginEdit(CultStoredDocument record) { if (record == null) throw new ArgumentNullException(nameof(record)); - return new CultInspectorEdit(record, Clone(record.Document, record.Descriptor.DocumentType)); + var type = record.Descriptor.DocumentType; + return new CultInspectorEdit(record, Clone(record.Document, type), () => Clone(record.Document, type)); } // Whether CreateDefault makes a value: a string, struct, list or dictionary, or a concrete class with a parameterless constructor. diff --git a/src/GameCult.Unity/Assets/Caching/Editor/CultCacheStudioDrawers.cs b/src/GameCult.Unity/Assets/Caching/Editor/CultCacheStudioDrawers.cs index 12eed25e..a421a476 100644 --- a/src/GameCult.Unity/Assets/Caching/Editor/CultCacheStudioDrawers.cs +++ b/src/GameCult.Unity/Assets/Caching/Editor/CultCacheStudioDrawers.cs @@ -16,7 +16,7 @@ namespace GameCult.Unity.Caching.Editor // frame's edit copy, so nothing it or any other drawer did that frame is saved. type is the value's declared type. // member is the member the value belongs to, also for list elements and dictionary keys and values, and null for a // bare value. inspector.DrawDefault hands the value back to built-in drawing; inspector.DrawValue draws a sub-value - // with claims. + // with claims. inspector.Record is the record being drawn, read-only: a copy nothing saves. public interface ICultInspectorDrawer { object Draw(CultInspector inspector, string label, Type type, object value, MemberInfo member); @@ -33,7 +33,7 @@ namespace GameCult.Unity.Caching.Editor private readonly Dictionary _foldouts = new Dictionary(StringComparer.Ordinal); private readonly Dictionary _notices = new Dictionary(StringComparer.Ordinal); private string _path = string.Empty; - private Type _document; + private CultInspectorEdit _edit; private bool _drawerFailed; internal CultInspector(CultInspectorModel model) @@ -45,6 +45,9 @@ namespace GameCult.Unity.Caching.Editor public IReadOnlyList Records { get; internal set; } = Array.Empty(); + // The document being drawn, as the model's CultInspectorEdit.Record: a copy for reading, never saved. + public object Record => _edit?.Record; + private static GUIStyle ErrorStyle => _errorStyle ??= new GUIStyle(EditorStyles.label) { normal = { textColor = new Color(1f, .35f, .3f) } }; private static CultInspectorDrawerClaims Claims @@ -62,7 +65,7 @@ namespace GameCult.Unity.Caching.Editor internal bool DrawDocument(CultInspectorEdit edit) { _drawerFailed = false; - _document = edit.Document.GetType(); + _edit = edit; DrawMembers(edit.Document, edit.Source.Descriptor.DocumentType, edit.Source.Key.Value); return !_drawerFailed; } @@ -242,7 +245,7 @@ namespace GameCult.Unity.Caching.Editor var item = DrawValue("Value", shape.ValueType, entries[i].Value, member, path + "{" + i + "}.value"); if (EditorGUI.EndChangeCheck()) { - key = Model.ReplaceKey(_document, shape.Type, entries.Select(e => e.Key).ToArray(), i, key, out var notice); + key = Model.ReplaceKey(_edit.Document.GetType(),shape.Type, entries.Select(e => e.Key).ToArray(), i, key, out var notice); Notice(path, notice); entries[i] = new KeyValuePair(key, item); changed = true; @@ -261,7 +264,7 @@ namespace GameCult.Unity.Caching.Editor if (Add(shape.ValueType, path, out var created)) { - var fresh = Model.FreshKey(_document, shape.Type, entries.Select(e => e.Key).ToArray(), Records, out var notice); + var fresh = Model.FreshKey(_edit.Document.GetType(),shape.Type, entries.Select(e => e.Key).ToArray(), Records, out var notice); Notice(path, notice); if (fresh != null) { diff --git a/src/GameCult.Unity/Assets/Caching/README.md b/src/GameCult.Unity/Assets/Caching/README.md index a5ea3d92..d96f674f 100644 --- a/src/GameCult.Unity/Assets/Caching/README.md +++ b/src/GameCult.Unity/Assets/Caching/README.md @@ -114,6 +114,15 @@ for list elements and dictionary keys and values, so an attribute drawer checks the type it is handed. `inspector.DrawDefault` hands a value back to built-in drawing; `inspector.DrawValue` draws a sub-value with claims applied. +`inspector.Record` is the whole document the value sits in, for drawers that +read sibling members (a texture path, a hull's tints). It is read-only by +contract: the model's `CultInspectorEdit.Record`, a second copy of the stored +document as the edit began, made on first read. It is neither the cached +object nor the edit copy the Studio saves, so writing to it saves nothing; an +edit reaches the record only through the value `Draw` returns. Within one frame +it does not show edits other drawers made earlier in that frame; after a save +the next frame's edit starts from the saved record. + ## Inspector Annotations The annotations live in `GameCult.Caching`, so headless shared models carry diff --git a/tests/GameCult.Caching.Tests/CultInspectorModelTests.cs b/tests/GameCult.Caching.Tests/CultInspectorModelTests.cs index c5fd8cb1..1de5eaf8 100644 --- a/tests/GameCult.Caching.Tests/CultInspectorModelTests.cs +++ b/tests/GameCult.Caching.Tests/CultInspectorModelTests.cs @@ -216,6 +216,11 @@ namespace GameCult.Caching.Tests var record = readOnly.AllStoredDocuments.Single(); var edit = model.BeginEdit(record); Assert.That(edit.Document, Is.Not.SameAs(record.Document)); + var drawn = (InspectItem)edit.Record; + Assert.That(drawn, Is.Not.SameAs(record.Document).And.Not.SameAs(edit.Document)); + Assert.That(edit.Record, Is.SameAs(drawn), "one record copy per edit"); + drawn.Name = "a drawer wrote here"; + Assert.That(((InspectItem)edit.Document).Name, Is.EqualTo("original"), "the record copy is not the committed copy"); ((InspectItem)edit.Document).Name = "changed"; ((InspectItem)edit.Document).Numbers.Add(3); From b85a82872eab7bcd828bc610b4102a183266cf19 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 14 Sep 2026 21:18:01 +0200 Subject: [PATCH 13/94] Release CultLib Unity 1.0.58 and the Studio 1.3.0 Rebuilds the tracked plugins with scripts/build-unity-package.ps1 -UpdateTemplate so they carry the unset-ref wire fix and CultInspectorEdit.Record. The Studio package moves to 1.3.0 for CultInspector.Record and depends on cultlib 1.0.58. Co-Authored-By: Claude Opus 5 --- .../Assets/Caching/package.json | 4 ++-- .../Plugins/GameCult.Caching.MessagePack.dll | Bin 41472 -> 41472 bytes .../Plugins/GameCult.Caching.MessagePack.pdb | Bin 18920 -> 18940 bytes .../Runtime/Plugins/GameCult.Caching.dll | Bin 118784 -> 118784 bytes .../Runtime/Plugins/GameCult.Caching.pdb | Bin 37948 -> 38024 bytes .../Runtime/Plugins/GameCult.Logging.dll | Bin 6656 -> 6656 bytes .../Runtime/Plugins/GameCult.Logging.pdb | Bin 9256 -> 9256 bytes .../Plugins/GameCult.Mesh.Quic.Native.dll | Bin 15872 -> 15872 bytes .../Plugins/GameCult.Mesh.Quic.Native.pdb | Bin 11960 -> 11960 bytes .../Runtime/Plugins/GameCult.Mesh.dll | Bin 675840 -> 675840 bytes .../Runtime/Plugins/GameCult.Mesh.pdb | Bin 160904 -> 160904 bytes .../GameCult.Networking.WebSockets.dll | Bin 14848 -> 14848 bytes .../Runtime/Plugins/GameCult.Networking.dll | Bin 524288 -> 524288 bytes .../Runtime/Plugins/GameCult.Networking.pdb | Bin 247280 -> 247280 bytes .../x86_64/gamecult_mesh_quic_native.dll | Bin 40448 -> 40448 bytes unity/org.gamecult.cultlib/package.json | 2 +- 16 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/GameCult.Unity/Assets/Caching/package.json b/src/GameCult.Unity/Assets/Caching/package.json index dff80c97..2717cdeb 100644 --- a/src/GameCult.Unity/Assets/Caching/package.json +++ b/src/GameCult.Unity/Assets/Caching/package.json @@ -1,7 +1,7 @@ { "name": "org.gamecult.caching.unity", "displayName": "GameCult CultCache Unity Tools", - "version": "1.2.0", + "version": "1.3.0", "unity": "2021.3", "description": "Unity editor tooling for inspecting and editing CultCache .cc stores.", "keywords": [ @@ -10,7 +10,7 @@ "Data" ], "dependencies": { - "org.gamecult.cultlib": "1.0.57" + "org.gamecult.cultlib": "1.0.58" }, "license": "MIT", "category": "Scripting" diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.dll index e4c51fc6bd2f45f6872da2bf321617dc22e4e3e0..7d73acbb9a6fc16af8565ecbc961e094781d1e1e 100644 GIT binary patch delta 13110 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 Y5GPOXs!kLlML$_nES&l`H8Fzz4=_06asU7T diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.dll index f1ba6f938fe8a225c329395c44f01e8e80ce7a94..f4897b893667c8d711f187e5492490c79abab6b8 100644 GIT binary patch delta 44282 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

wx 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 delta 43818 zcmcG%33wD$)<1l2Rj0bs+4mJlLY7K8orQ!zAV30P3jt+Q(TK7Nf;JF9G$b7ivM3-> z47-Bh2I2~%sG#C7A`ChxxQz_B;5xXVsGuz0@0_{`$;>2zeB7k6%VR!F(oI_=6}nq+wcmu75%hA$5q4Ieg} ze!%YECDVL1{m?oYnD5*SMzFcwigC}CTdbAtDRQfI$vwRNIq=j52-4oO!@jQ9#4v%IiLJbM@Ce0Wr#WYen9+a5$QQQ2Fl6DWy|063R zI2pO+1((Q&tqH+b_xeX$-D9L{$4U}2oT}pEwmR>TPH*=2v2`|hAcE={G7KeI5t1Mu zvYrU3s{S1+RFX@u)O=JkMjfSnR|{c8N?$Rob2Vp<=6m>xY$(YzA4=`cbb0k?Po&GZ zWc*=OgvMP*#^yXI#UojqCsaxT?2YJ zDgpG%s0Ppp(G{SNMStM`tgVmZiP_{>C*+D9PKebf_l-!P`vgEoBL*8ZPl ze-qo2#7t^q?>5YZFv8H>2|e$O4sPpW%nfpvH7fRB^3PV^xB(-dhoIq9Tc;<;>3DWZ z5;K{cwgd5@ix?SB-wR~)MO&kjSB$=}K8vgNKMIEKBbsOqfirJ+qouq5%gNncV=?vg zC>JpjZ2c`6i8Gc_*EcI+=bHqg`5vb{zigZ5CzR)84wNKjd&C&!&{=mt!&hyUKfR(% z5?eXIR&MyZtuE&4X2)M!zr?3SZU-aM<-3i_F(@#?>Dz8)C#3m_y<`f8FgQ;jZTcwS zQq+=fEK*%3Ng*KG0a1jDFRCtbj2Y2^Vj4MWabYVcb#oedqN0QGq-{@^ykuj>=w?fg z%H5paO8F^UnJ%RKxKg$bCZy!4+{=s^pEdhvE`ZDTG%PZ_M&^v3ZjS6}YhPlV=;ZtZZhG8m1FxL`dCbv2%L6r)972+Is$qlvlB5l9(n%`F&fR zuSw@mtn>ZOn>vKao|nLhijRoboDoLD4{f!-A??kqO%gK)9?kpEKkJ1=i1BlUwId}n zSpsBu6Eh>==8|!ljJA+bRARlfzE5dL`mwFsZ%M#V-0Ncba!qae}t|CD_t~>1&{Wt4bb6!#i_aN+4gORvogpw<4$57x9 zYjE~ve`s5I*cCZR%yP;wtgTKs>GWnFB(WFp2q-!l!rN*_kmf1YB#Bu;-XdD-=$DL0 zD>Wy6=fa%3w4{V)Q9KftjCN#>7DKQJRI>;oM?7!P zjE@t=wAyTBewR^4a&M4fVprs0Weu%bYULFa#rA-wV3*T}`f=A6Lr-&EGJ5X3qaa7d z_u^c%dh|gDGAkh|49l$-3m41ioqam()@8JHq4UF_50!k_p-SnO+xiuBan$!#W`nG? zUD^#EqICM&!hX2uh_*{|OSD?;qcjgylEkQ^i?2I^I}u`oxcaNm|Bh22S6NzDPu@uO z80x66CYM_MV7ln_L+IkDzltsa^;hFUCfDq|p=+*mCcwt!i?^1Qjt&_LQKYEtPZcn1 z=lRl?G&yYNuCib$W2}8Ww#X=Je9wL|X6F+V_Exp(w<7%A@#%$G{;dd>BuS=TXuKNBCXpL(RT@52Z7#dB@IZGQ>-2X_Ozd> zED$%<@I>-wVpcS$W^c3N2DX>CTfYxTmOg9vz>Kz36j|3q8Cc+$#?pSkYB^~Z4GX|VsO2+q$)Y7rmcJ|$ro_V)L4J1 z+Mje|Tlu&v@*8(<8T6R+&j81*H;itpH~vaKB(Vd-hRj17El-f)Y`Ced!GtRYB;o0d zt!kGdntC*;qqZ{&l;LQ&xwWPLk};7?mvPJ_vh$ij%|52J<|X46Qe4i8Br$8DgZ8K; zc6T(QIg^aWwl$h`#XCuC@3Ww2&Ia-A>_4PLOB&VI<|eYSYjM=hwO5DAgnpV%8^Z?d zuif>xp{wV#*XroH^VOjb8A-P{+oMyWS!a{|EDrScopslJp-sLGfM-q&eyz zRz3)luV(xR;WX%RVwh&aqv3UHCVG>hUy?boIY|W$Q7?oTjKz{>l&@2pXB22#vL*_B zGp44X{hJ8D9VyI%xMn({hsFh+hzxePe20L2f3wEbcp?rXS&tovL#us@k~^$THA!*U zULeE_Z*b;}+tZtU*Kf1lsfmf(uHq$~91&HZ39PbWh;^~1R$gUIzcHbZ+___eaCShO z3Aa{93>~KhZzBh9jKZ33E<%Yif_;CtUcS-m!VD7u-Yo0K8_m8$sbtaS4jAMb4f820 ztqz-@wtk60evgpfXj?(oYcYkA+jp!RM`sSBa4~6NBj(T@4j;~U+`cdj%qQMjU1GaN{XpS471wZlp$wXeQrwk9;J*U^@iukEA9y0(IyUM z+-RaWyK1h30p>+2*j?7Do6>rtPhhb5-h)eL-#gJ z909mP`$aG;e4*u`Q~C-XWe>pUg|ZFMGC!sA$nrN z<0!XLM@b(}1Ki#e0PDq@GkRha88d##5Yx~l%BR{ za3!v74kCF>&W&7%BD)X{A8y0lT$13}5S#`%0)4oLb_e=S5{s6B&QEI zHtt}YMwwqAfyiYDDe*7>sTMt0wvzx;48C(sXBNfH@zYLjsWwFzQIk zF`M%(|JaV<%V`XM4PSJC;4z!5=f?Io)X=#+HdQXNQpd#^ww2X$T$&$;6A`s5I5Vw& zF}z{nxQ{LY^_T*&UfWsMFCk#m(Zx3s0o31%6qZ4{nAAbICnV=3#4U|NQ8QwjWp$8k z33hopC`PEm#2iIy>`LUC$NMj{KY|T%f@e|u-%|XGzzPWs2+YN;SK^GiEIJpv*9sY* zSw!LSDGv_bX8aQZ97NcGC~m?Gr%BvIw23PF#POYCZ{UV;*cFJju)C}E)cBO%)Mp;xPm5hIeSXBf^2&51$Z|{4cl(^r8H2?~xPk zz+5BH7YT6O8Q?o@RZQq0YpgL7;-Y9=2iVo9^WZkWv+kSVb*Vu&%X)1>aoCO2Fstl_ zp&3S>Xcl3)aX3&*f1VTfeLn-~=Dife3=RUD9lPr8q7Z+9IHQpybnohM8__)aOVPIIFyty&_wjrb zr2GC1=*2`5ek2tgi0*CNF5j%>}jU+LblFrPwI&(?qch(_^xePj{)pv4UAjXlAgK1;2HFt7% z{~c}3{ABhAn~}s^POdT0x6Zzibg<|kdy<$dNC%5XYn^$dbAkPk#9Rp-PgO)f!>qP? zz3WL4M<8%UBGV#gv)d{)kPgl;phFUK6?C*q#tIaq_Oi6*+*;!2LSYdK5Jj30IPQ$7 zT@5QY?gEy>#L(ktf8ojSIx=HD0p=ZuzW#m)^bXNJ+z`7P?rNLm-IOKnc9A7X%rz7i zCYaV`Y`UW3Cy}i*x2@8AQqtKGNzAq6sG+USJ*0#CePl)wa~*Vo^ds>&Gv~e->kELe z6m21D*FqOlvWc#a#rRI@-I#6s1`U6s!Qa;LLUL@dW0EvrAh#~SA`&}UOcHzRw;q|- zqiP+_z)QwD(x7VKvVpOl7%pOLfL^fYc4xyp==xhtWs6BAkiC+~+(;$98>v=0_mYmA zbx2}9Ksrrrb?zgbAl4y?`5fjh2zoFWe0mSbcBnC2zLwxh+*jSdZP7 z>5rrgk6@Ctrw?BgaAw94+ADAyHZ#zOZ5bFnZ5bFUZ5f!K+cGdlS~D84_3%4##_GJ0 z(R|U!I-1UE@h}6)oYi_=EUtQ89H>LDi^oN?c_s$AQQHqB=ed?0IBtpE*nua~C7?cu zF4!F;^EIFzMD3frLR+G z9G$p>U9p`4ov|)o2Y{d%gEcWt<4L<=B{u;tIBO|X9F$;`th8?Nm8Op+k0wq;@cd1~ z^S99`acvr)TMLQ}_RMy=d>yU*V5eIhr*-mYK;p{;Y4}rfyRJgwlJNkwYZe3VM66_=?R7x~ zVfTy*%0WKv6S+PQ1&Siu9nj8X^A&rNu)X^P+D^!DIKW?EpvbL3@5rlt06{mtfaM=e zK~taG8a{n~W-h$ezXYyk-+OuqzkCJf5#D26oSy98LZ!}c(bxG&qHTq(zOvH!p{LC) zWLrDOI?97O0r{ru9=gtG>0)~U(Zyb&OF;drN{P6nOzZ$kylOo#Bf0-;q~)mJN0)&5 z*Xe@(_!qtg)bHo3QIEq)@SXKIoy65uk8?Z=Q z!0X@m8c=`ON~w*u#?+?7(7onc;F6EG=}HW1e(h2}cWu~<@wD7LgvN2>RAU`lMl&Bn z`v>XG4+j%bmnLrSaK2_g3^qd`r^P55i%}E=A+>)8&Cq-=(na^ZOqT%PUS^sYKc47I zy6;sR;#Sn~?HfnHW$$ymh7)p+jPw14xX3q_9!e&W;$Mjq=sQ3c%${4Q6Lmsc`EcLM zoUJXKzky@#+oZ@s!6sNSv#w3BHz_&Mr~&RtIeE43K(X-y>z-NOm-ZjU@_Y+e3_-?et4Xn>4b07|kSnozkdKO7ExiL_3ZBltB-> zh)-GiZne{|S^a1Ck=v~MW|w4b13$;D(|^c)JE8ySYJELBGZotecTOk04r?v;Y#=#R zdR;M?dL72DySB5He@Bm`U(n#Zw0wZXB?CLy=7$!)SPSn+m0hfDcO=PT>#ujDcf?7o z+Y@4BTyoOXTT9UPW#SZpBiUmG&qAS%>JpUbtdYfihq{oY*pC1Grz8 zLs;)b5`%fJ8`n!Q{wmx6Yti*Vq|o6~Jt@-dy)HgOMw2-s;<=67KqIa@)@%`*qs6eE zrq#J1qT3y#p4=&h5A%kbJ$79PeXWk2vo1GQhZ0`}A_;Ovn;WdyyW;$08{(?#4Q3!y zGZzKO&2iQBVHQ#Ib2!b7)137NwsW>KwZ~VtNtZ8QR%MK(nSeax zB-U2K?OlL3Fh-=!2R`VXs9!2}hf78AS{+rHNtIU=q{Z4rcYB<%wCkfyYF!}Y^;8w; zD4L0#k%3W$O^nePY&q+E{URZveEE8162sI%lUOue0_tPvf=MivuL1ROxRMcR(KXuI zQJ3t>tHsJ}G{#$>)ZHfgT0`az4e5u#kY9gX8V6WA<|bT^t%7mosK@RNzv@2hBe3ga zp$|=_`>>ZVW^F+Sc!Y@V!)~Ar#-_li9ca6+BKL!=4)w7{H6;gI)9Mqgk@YbK9tF4? zuOcX~w(hI%;2#PG`lMDj3<t@IkHjSdTZ`t0KqN8y zU`WB?Fwg&(Cpn~T$c?oaxY)8gUF++Mz_WAU46vWZ7`1(xPs3Z?D0JE=Jal#BcAW7G z{07#MiLV63h=66j^;$!+p9-w;lN@t6sz*5-hKTv7z5&(MI_!>=#Rw>7G?K)81{s;p zg81;f1m{Uzu{H~wUtB{7U6CpP57)0ob(tT7L^)f9Z1}FF`w4KYG5)A_q{~HVrQ$n> zXyZotuCrG7<7K|J-9K7|%-Znl@cjtCcC*-q^_b$Qd~m1LbpoZQBQ%j=J~V1aQSecL z^(2T0tf#hal^;Ulh{)J?298g7Guw!-*CP1|3@Jn_>wIfnW1dL?=_=ob6o6K(olZI5 zKsh(2SU)r-#ZpU{3s7$~LQ_!2oD!|B*h-m~JbWrDuoe@Nfr{x2wK{4HZEgu!v_t1L z=5|5ShvnGq)iC+7lKC8b#Vrk2Z$^>EmS`-{n8T2_#slm zjT98U@^=*ymyFS%wKoy3ktF6$xYg=zCWhBu4aShhSYo*AiEo&@s2H>}r&S&!DI!do z;~>%M#)D!pz~c(H*DxjYthlB)zk?1~#qAu)M9As@QE|5**_;a=B)IJdS?+q`8|GM! z1W%V*bZ#Y`DZ~h>C%)7CGevR&*-r)J$r{fMkhCZ3;}A=G^UeANImfbP3-JF<{*$Dt*&wiSXbO@bpzPc z9zd8$mGdY^Jqd7xXlF2xwd@Qq&9-DP&}y6??dOmOQ^+%rFEXJ#h5*;%KHR9U0@UjI zf;wGPd6-{XRbI{(Tc+35!dS2C3(BjBO3r`_^Bt<$2W^hGoo&DaCrr+*rQ0ALI=-1m zVIwm8-xONpv#cKX#JQ)V()HY)T3wYj`ku@jJ3OlVx_%%&?Bj6eRYz>!R;2OjWgScV zT2I~6uG&tLHVs^R7EJ?e)kwH;G-~g`0M2M6iHSjJKkGx?kXuY=%3<7sY&pZKSPgzM?%~x+^w!nbiE$O zzICV_-8UCB_L8if-&(w0_cemQ%!^&mJrG3GCYCqQ3tABR?d|Zgh`kWoT!IK&T-n>j zQjvjkJ?g)+a&ha9?%*92X{NXtv2uDTEaFC^+Jwf=t}$bG)(amt!M8|>3T2h zb4oA}??b|T2=UYL(h`7X-cqD%aU!P9`6b^~Otb>;8#tx}jk1VhksPU7EGdH&WY7&I z)#?^QuJI$Cww=aYNWnd*=cYC5AX;dm-W-^Dm*Rp)O&{OaK`yiYxUblMKO)fUh?o|JK3X*e``c_b(#v-#;yp`bDrOm6|Nd1Nm zWH4+}?2Q0!e=TTGaYyU9k?PbRJ?E(P_7c-cM*_NUm347Ra!Wd8X>pInyM^f3AjD~0 zZ^m5Parn#`lW)HTeL;w7tXgyO!5cYT?8p5fwh5wR|B(YLaXkjS)>^UDLt6s@?_#Sa z1a9L*An+<&=@xIegS(Z0nE#=3iEa4z4gNXt?_c;wG9CX)@vlAp;kJu;LVSeH3;h`) zv6Jj&h^|FMpU*dYhKa0R#P3tE++S>n4n>=~8X~ih=h~Aw~bb4Q=U5K8~B|0ID=tp6@V-2w`nCP}(;yh}~UVdDHh;;`G zikOD5IELxMQd0elji2t`zRD0=SSO=mQ&+d>*6HKUh8P@8I!|?@;J#pbKkGDc#y3Zi z^akcnV7fdkvb!My3Qz#Q*bqeGe-%<`4nXV{C)w$e=#W8%c##b{nxtcu_3UkkFq7z} z0<)(feuyCcM$TqxnCulQ?g`EdH-w3r2o>)KQTlJ4NGGJkUx9LSVT@o(Cv)-q-z1PY zr619|5X$``wgHBA0 zag3&r%#S081Q`g!r>p$M+444#%;@tVLbr=F`4F=2jG7U`Co)*}E6aQ$lif_?45x`4 zMlUd$E^-;2<_xC`FQYky6wGvy$LNPVLjD<|fZ=+Mbfzd`)REoH7A1^UvEdz}E07SI z(y0>Xi0&-AGnQ&*zC!c66Iv?zv1~J{d$6#?)f{&JE>xrk#5k7is36%UznI8y2)FN6 zaVw*zOGx;rm<}XF6KD98Sjn<^DE(mZ98e=_ZA~viFNn2_jNUd{FZI-Lu`ZV0;Cex9 zlsYsol@oeNY-V&HZnp-Dy~6(p!&3CJ!QwTsjgc2SjKShf@f@S8SoW6K-OA|);t0#W z$I>@gTomUR9l+oiEG~)P87;@i8Z0i03ygMQ!NdYBFEMJspc*VRDf}A677{`*K;i|B zmbimuFw4f_aC9&_R}`alxZTEZk}<6`<7E;fcM!?arO9X_qb!-rXd0tzna?PiQLZe~ z{FHqO!#r8SSsX!?4;J~dE2Bj&LPfGWBRlS5*@MyG0Frf|Rv=$vV=sFouc(KaPp z4wct33Sqn93cbskBjqTTy~xdUt-OItZ}*GqTIHaSykLXir%>-ppztz^>(K{gLQv*kj0KOw)cV_RfH zymw9+E|x1;)$T&e%nG@-Rfa3&hE~V|y3(Ik5kmHla&gzmhqO!) zSKjzqUHr$akR?@b|{#T|*-{x_vj`jN!%{V7t^vFpd$JD_?gB{0=6%42^? zxu$VS-_X=+8uR;wf`5M!8!+w9A>PV#9A~qLX-*Pprlm!K_GS7)YHVt%xHlyUw5DSR z(4X6N1f}AEgM9s|98oHlGL=i2DlWB`PzprUsbXqM7SdW;KIl8CWpHhm*e?D5d%06l z?)9Omf=b*R%9*sv)IxD@b^lc97oinb!S%4b%9e8POSlH*?$ep*nD}cTotkz%=-sJA z!;{8>zLH2GzLd2)tfNTkJw3Ifn4NHUsxGF)OVGWbsbX*SO3?M?t3fCAdJOc5UeAJt zR_p^^UGV{^-{0#~TuOSK2HlPzr1&|bU2=r@IpJ5NgR80i#-cu?xG&GZxdl0u;`z$3 zv{cbKH5zm`w|8GXzXfan(A9{fsp)5R`?m?}Q#PzcVIYEKo9a_w&Nb9)?vi&U{3 z9j&>#>`IGA3#E#TlwVR(#gJ5@lbH7JPy%-|I}&}FJ)BJJ*iwJX6H3#rX?(w!=+W*( z`}ZaKeF@R&U5IvL>2Cx51b!Vv^b89&!njB@=JbT?4XJ%V?I7|yP>2t5pcyHHz<(ua zIOzF=>p(wmeMEoJxxoA8Ox#e&PBF-Xhvx09~Bu z?1!T51kMCeK=8vV+rVEfkbzN5*;2v zG}|At8kfTGEueiOcYv;sejcOpA+ z4j3Mz5#e-3m58kg!1UucU0 z-3jUpBpS>$w=+B(>2r}?(F5#$WA~wRiJScBAkjbH3)R9dnD-j=n0@-Iei)A=VA!e$Iqa5J3EIGX9@iL z6W%DjKFS{}`nvCniWO%=-;5&GigvN$kh7>g4ju-r4>iP0Z+(U#p6hi6H)JC#c8B4{ zIjlWut2PG{j*{AZTmP%#O_180{y9|D$zgtYvpH!!iSs}a(dF)h4!HkM4y*3aEMCzc zs{k^dhb)IBkfR=*??u`+?$wW)COK>wINKsdf)+(l`qaQppw9W0>auC#R(cn;O(VgMM zITuOvCI@le=9WGhdKBrqB94Q87j={~I}Q3&!ehv0WCf*fueR%^Roc%2y99RmCM5jG z*`I@>1pQ4k&DxT1yDh<4?a(q~#V+Xv9qx((-4N0a^p0>7ba7-S(6v$hK=($|s2LS= zHPV&Zc+jU^MBfd$9W+zS0ky*YcjI!ia~0^nf*$~VCGt_wx1#ofeiZ#K=o>LVfPTxg z!r{)uJ-mmi?#8NLQmAC-!Fiu6^8u!R$+-m1AC-ERA%t{wD%q%k2Q`{jTBL0ToGlg9KoD(sj;$I4W)#H#16F)2TYmabzu6w~o zT;6bzm}WcORCNe@`80(ds|v>{fkz=~-w08p5H)XvC{sxEJtQMVWwT~q-2X(1!3rLa zi;0aABNh5OZg^Id7;PiYK3c3)viz=xWVBeXPz8EIwAiZ9kHu56V#E^)X`QD7?NVr7 z&pGJidlXvQv%wGeR~vE`apHR=49h$u&I*Jm7<`4WcP&uO} zXubsGe_RQduffQz07ndE$sdG}80LhYCfOctxK0 zM4_9ylk96oO|DsGC$jRykA4M<`h1m@FU~2nqW3RA^i&J8faqO)3FtLOO`=^F-OLwf zY?+J3c7Zsr5RL5ufg4-0bJ3iD9j`((Clrb(g=pA!5=ohS{<*+K>-|Ew7@l?Pny|N{AeSw3`gia z#axr@7Kp+G4`fGMP$#pO_*$U_ab1BrX4{%0V|$wAq7xxM4DTOUW%d@8ENl|{O8Tg$5^wU_?poQpvn0B>T55_R*3g|)S3fDO`eTz=~{=^8JQ^g5|f}!aXL49q_ z1Mo6kbXBM$vac0Y3XRD617Gn@SIA$V`L>)RwkvoJs7`#YP>%#XyFvV@(262=wqKO@ zv$L?GUyYe39=B0^VULLHyTyJ+G_}M4eZvTSrm`q|fjFbk&T>NM6`J8sC{>u z+<328C;}B4+M7_ijYMU7b@oE>@Blmekil=u#o{eSlwnQw5^;{v0x@gg*zBcZ=s@-f zbZ7Q*F;=0SMb8CWV!lHDzWznotHeDs@KavI~3Z{=Py9jI8Ua5*QN7epvM&&m~kBFxI*2% z-)BD{%JJF_X?_*^TlOY#R-yUj*#B=5fq05S!s9HARp@B!MX07IB;zh-ZxIbGC?V$& zu}YzxMc$mp#eo)7l(S8IppdU$&z$YzltNSc4a|8${HV|Zb7amAznFHlo&Do|C+0jQ z4!5AGIZumE6#6`4X3n!>z))NBk-m*NJH;f0-YvN|=g;C3h0KywKo=BB%vqoFyr{%0 zIaI)_s~*bPEp{>bQWoVIcv$UE9!^3_d{MM5=VdXIQIqJ@|CyY&g&w2B*|8Y#J;b_>=#oR%@g0`-Jkte@wh_6)Bm1xK%`t_dzskpc+NpF zl~I%UKH;~Vw?vu$T3fifv%~YYIIhs`dF?!Z7s)r+vbBQ>JVyl{Z{csAsL2`Vd0*^O zXuWy0=R>h%v@IK1HOBL?*nE?XZU8zicHB&8g)oY5@%&SKsL-2LcY98Xo5#eFaGv-~ z^NLT!n`3M=E?}AU>XS+SHJ(q!-^LPeKCcR&@h2ug+~YqNapPF#8rG&EbPj#C$HgD%nwtjZ>mrp)b8BVor&H3f)<`!|(Y*jIa&4y1o#P zx1c|Jz7+2Kx*fI}sCNNoe42Ro1PTtT1Zjq!ZbB6}U0-?ku6=RKZp z#dqxU4elNO(;{R%$>)nPcs_humepRQ@$&U?BwM8``J}UP& z5zlVk5XXuS$@3yZAu9cOQO0PV$oCRDJ&{b`5L6fEg?WpOs4jjNV-%vg_(RN9i0a}G z;ork>p6KA++g#%j|hRb1$z6>N;gsib;Vr$W`+z7duk?kc) z?rX6N$1}u_Y~)&2f}1({X^YGd(efK0q-0d%nwr+yq&zP-PXN5rnWegws?!A0MZLrD&N% zImJdSOO%V1?DP0?BT24M$mrx1N%C<WOec4 z3H$;^I2##(wojJJlyGnNYlD*IYK0bL-3d1jDl{P05A>))FLb^K=qVeCsp+e7lI3fR zR`6b_ojk&bLc1@wo$OF+ht{$Cy4*CGWh1}qS@iWZS*(OZJmq)-Q>GBz-K5D%g{H=C zf?>5nKWBOI=D-MrXhKetH8v8niDJv8jil#8-K-a+s360$H}aUdawYmMzCA85JT&PEoQN51uE; znM$^!Z@J--bCqnbzb~F_$a|FV>7KiCbLCPce68nRpw&vYqW6JZuY6F+9_alJ&|^v# z-VL{%@@XYY>K2aoA9gF0h+y*NYYLeNCSM-35$eK!Jhwo8#BhOYSXsHzNq(x(0^DkK zlBaD1)z5P~$qTdXHcaXBLvFEj+`$OL@He1EjOK|b?{B#!^5#36t6TGSm9rTwa9zv@ z^mdaC3gL#$FS^ME3a;<(1zN^vp6k*6Ct|wEHMUGlE(`T`mpc^l^^5kF$pLq9_6RN6 z+f(ke5ii>nau1``;(?N`-U>W^CC$}hXH`#cZ&|=-f%vVckJsNvKCWPJ@gQ%d{7|8P z6kY4>D+l1ER@zqGlXJ7TpB%4HWxrdz1LP`&Hs>9P7$_a}wq{*FpSMa*Qs|wYv%J-E zqe4Ob8@+>Nc!RC^R`+|oL;Z4zf+cquz1yLxtRfKl9!q3z}@%&YV8pDRL^K1!7D2Y422dTA_^Mi{9I% zzkI%}>KN3=J53fZveCBQj=brz_Fh6O#PWoYycx1dp_$dOc{Ak$3N0O!oHt7zQRs3} z$Gq9{f^845e&k1+Rw;5St4YnV5%CGzk=ZRf0WqEhWkR_x_GvbtXb7eOh zx!%thk~dHGR%m+qFrX@hXg!!GhbffNzZ9=firJSn}&ABV(d>~r?Ty#*hQZ7+KIvH9i zS1CkiK`Z4(h3NEWrF>W+I`3I2cPK;$JS*ic8zK7xc`N0oO4b9vO1VaUqfknpQCVx` z8A4e9Ty*lcMxIwfIzU__eV`y}V6wi$ZT@oygiO zw=48X)_Zvm$z6gK_O3s$bSOA5@5^xfxqYNkhu!Y4;A50;wv^= zHc1BLKZVb-Y}CyakpHyote!THa~DuqV-!=v(_l_M0K7TF>HIeA2(G_5vor~FW% z<$6~BE*ZAUc3K^npZ{msPobfqUGkro0~IyTzLPa5c^7qJ@3Uv>!&fhER6&f5lJpUDWpF$5uU!VV~v=l0j zxh?-SxmlqNF^&2Avq4D^6 z1OHoci-JFe}R)Ga7->& z=$(kM1@FoI3YA3PTJXL++hQlh2QqXGW%#MwjXT8;Wv)V@RbC)};#w94ngga6d??dw zB>(73syO~4!@#-$J%NgqY*X1C1s};f6gpcrT>L}&8QE*a$MQZ#c9A}o7NaK7O`lir zvD~0gMBu!F<8qg6*d$^xfc`0WE8*Vog#{<%HwtM{BK)L0&4`>n7yOC*!$y1~^{Ld? zQJ^GSTJWhXu#t;a$}eSCh59E1dcTzA3ej2lmvX>5dxPQnqLSd%N=OUtm-0GBcA37E z<82ww5MRovjGDwp`nrNI<(&%6(jP1MO3qX0X~&@&+s{_(rZ(D9pXE;9I$K z9j|{);zrlHf`7?ZmC%ZOzTmVxpwO16y#?RNLkdlG?=SdXeyEThQt}fJif-kDWY;8mh8-_BC+}ord-+|?Q?i#M z))o9NS26P2!aw9jC43>kEB=t%TN(Z#cPZH{Wbubg+;k@0Ncu#&|@?=8@^r?+0o-l6Sg)FeJZ4i0V3!>whFjGDwn zzfs)5p{;8r4A34@!er;=f&lH$tz?F_SII7*nGEf3jO@N{XdkrEJgGGIg}4h1?X*I} zFbO%evkK*f`sWq6vmo7AUFgg#?-f-=41=qMky%E|wtyCkm<4U&5 zFhr!*{?RLy7^#_znnVrDZfPU)DcRkq{77w48`*Lt>l@Xt0KZ7Jm7!gUQQFh3RHL*P zlxmv(K~$9X*H)U*+B>Z@qqUEe=4QvquxRb1La)dJ5iy#0%&yVduJpoK&85&IA)dlG zzZS0GyzrvJcr9L`9g*D%6SRDVUXB`6n51=4=l~YZWNoxU<6?#tw$tV+G(;O$*g@N; z(2K5dg(=zx3LOu*wJ=pXsn7%A(+kryf6(K0Y=xq+u%i~Q&=lvw!gMV~p#(Rl*?WKMM1-Pg=p(;9#?AO&mR7k z6qNn@ahZ!c(6|nCF4_OYc`AW)%HR&Kv9(H5i1r`7vPx2$5?{khd6XH|mK1AIi&8v^ zyjoMgCVpyR{qJeKct5b&*w*|{j_ta&pJt9$MWGx`rgMv< zC2+wJPUkDBe6N<1Q$Om%A(qFhihwl9BBs*3(y^*@d6 zxKZs0v^gDszOCVPRB}3uTivF2qvum&5&x%dSJJ~0sQDVf_qT07L}bSWYPas~+{QMg zwx^dqSHw+GK11IH|QdsIqz~PPj#lgMcGJkHFxk;v6QxF8g6dC@UX#u%cgaf z>$sWhDafwazamRbd7!k!>&I7U^SnZ3P3uWCFP8#3$^qHU?f;mkg%8-+t|+3-6-z?} z-#PKLbD%r9_-ik6@iCfAim$s+_SIFy?~mq?;s-7a4b)~2l-9&u9;zD}_YVBn08R7D zQ4{z>|AX0C9+yO$yP-XQz0KX^KL^Hj4P+~U`|sInwkfj)7<~5Puhc| zxi?UY(nLXn#|L+IZ_vaMEWx^Xn-^kRr?Qx&_DW$>dz!Mxj?J+(DQ*8X>o?|d`H6|% z2(c!XW@yM@6=#2*Ic@hLyWCf(CNeSnn#(3=n6zhU^UN8Y)82&8wW<1k|km(^^X1P~#a8YsV|u zRMtaq7a;b*g(0p7$0?#PLApd7muv_xC%M=e=%N};;1D{-cYvUunP~1Y|9hAGcWFz# z`nfCFgXDWurjB>vDFceJS;;O9Nj33BU&``&F1@|2u<7uw|6Y3A>VKzG26F$m*W>@D zdIP%-=Pd2?m5iH1w5J_gYNvyFUa@Iw&cCJmx3pP*-aOefhBslhs-0PD*R6FzxGTMw zw<0wfQ@K6RY)ad$=GDMX+g;P{QM5iZ_b6JtntPO;=l>VlkEe2ti^=+aF`k3jX3v>S zRS}qPOIzzyV7Al*-rYu^wq`AQom75W>)U)gv(~h=zTY;m9ks3roAclJt((YRHNWC1 z&DOVl+KYtU62D>6m%^q!F*=*OKu>zjxq16Zo6r^kH^hJTu2i1D{+-`!W%DVBW{w?D zYyD5T@~I&(fpi{D+1ur|TiQ-vF>7{YyRherD^pbSM>j#gn=Q>FqImm*D;;PuFq&$gC~o9 zpi}WqCP{NaH;ePyomG$Gt!_I#r|;X~%&YniFHFCY6(G-OGc$r^rKl+?6@fYx?7X(I zZw4m(s2=#`(h(d{1OzdnM*LhpOpa$qse12{iIQATm4$j**%r{*{kF*(QCqZAmg-9i z_Q-AG03LXq(MtQijo&sP*W1KQ^Fuk4b>^yoHuMY9=BspwH$z*(1ztt@`o%_8eVD~( zw9{QiYvgW{wu3n}BD%{CZ6?!Q;JmEuVY*8k>U>!VRoYSR}9+5_H9s48Xg!CmkQAikiIvpbyW3Vdi`;{@D zi?@V}SE~OOAL3jE&-jLu{XZ-{e(t@uR!wm3VAWl$I$k~#yw5paULXBeX9Y6bZH$*c zgdGIuwy3w9dtiJ5j;O--v!lauVv$!Id>e;f;DQ6^V+_wu7T0orm9krj6t|rq%+NBTFjbdteGyUe^fHR znrVgn2WR$=u9IA)aw}?R1o%6&8c;)wXWOY{>lZUMD%nhpN?fBA#Xs)eCPwyo#yyuE z&1brV=_;n%#H}8$IE--P9OtzGRWU(lw43{xpyhoFgVxDks;&(>EEo4H#bfYy@sZU- za%0CBKlnJ(lY&oy;x$x_ z8tb%1AztvKdY=qF3qhRY0_bzW4opNlwBs6$`~Bb?fEl%PF!*?}4|Gy+GN;p-<}xj2 zTE;Y3r=Tm5-Yiz=b8@DJtkXAV%?Vkd?<|@cQqBBmohG^wI_Ce)qDH4LY-@D-+O|fg z=SSmN=^;JD8yi}q)0ek3Iz335s`zvIjtQNKG(Mo!>9g6HIz7Fa%hLHwm#}n|PW@@4 zPW@?#PQ_Tl!7b6L$86K@_j?^-+w`7QhIkeRAz^`ot{`{bCmaQEt7U5^PUViF z!V9(Tc^=TZl5U{YIhCNZE2=<`6%P$R%wZkV-^hw{9OrbQo|W)O_$hGE|4(yVr%_R# zgrDV#x}eioxS-RxDAVJr;vC6X$98CEby`3j4yyKCSd~NsJE(f29aO!!Ttm5N$Oe`bU}bY9!gZ)ilagXc}y;{8w7DQ4S-Myd7FFhmy-qiyah7v4cX{ zCa&*tAR^a6LF}T~G5^ydROX;;Dmj#Dwi@B6DJqT};ozBr!>U2Xo5gt6naVmdS!b@_ zL2X}Wo#E@4{cpwg^z&==mT9Q3*ODhEA#+{n^Z4*KSMm4lu?KFk~k7iI_2 zlY)0SXzkwv+ADfG`cOEY=h9+52I=?`l(oIcX&gQ}18e^g?8LmCrvmUU>N&5OCf>FHW}&LR1Yo>V={{EO! z$2WQJ!**-u6EPKz6P3ZT!Z9`DbEKar`WE!FydT-Kh+P4FeC_WT(Jd6|c~vp7sd{Q= zN~|MbaYz69P)7hwLBRm)LxVY8ibY~zY^i*|e0Xeyr1wq7Fr|%&g*3f$ilq}YIe=WJ zGuRP6DJ2yoh1iQZRG|~w=E9f`M)fHI!hTcE)|t< zv_ng0gLGCskGK|F~s};+J0>lozu@Hjd663yqq-E zplN5SLDSAugBI4A2L0m1OoKY&G_|nzkmQFPw3XfFc)!c=)Va^_KmW1u+^nRq*M;+$$VWd~IJI1y%L7xovA2(?I zE{5wJ+9@b)7N-pwoo5XiY{9%{2kQm+ndf6Xe+BC_jxVsL!%2(mVS|2dtrYW>c(-NXmeRw%=8pyv?7Ot*UV_0?h&G~xd@OK44VJbvE+ObUgo62T)>*SLp#ky zDs$2@w!`pKTw}C1@Cyd#wF?7>M(p6|PCIDCzk|)$LG2ywUA#tLDj)80P@9T!9|*3H zUt@PmeRz^b%uX>d1#B-Fl8-{s`ubU}=r>8$aT$ zaZr*J+eM2zw(rjoldtA!dPuuoo#Ng76q9 z1xiWpR)Sy(Z5e1YZFuxMzZEny?MywR-}&GFcg}Yn_o4M@@4ePqc~a~n!jV|n6h$^Z z08a~7s)u7=m#UA(zAMp>h_hHd2Wv4ih?&@=6;t=cUlx8vxK?dWm^|BrF|{l4veY@A zFavr^A`<^5@t4XAGk;)hR%_L8HmkO)4-RY>9hGytTZT@({^{)GVm1@Je;J@R+(sc)dC!EWumUxm>SFn#&0Xvjur*L( zb%c(O5iQ}D@XICn`uxHEn+V@dGoSG20!`ylsdJ(~z?od2@h8O}?>|f18h!|;QT#KyY?iA+Ab^vECkdYuM!6b(2&aio6OC}{a1MVC{}Qc!4poea$=esAoJPlE zOi!HQ?7G<6vIHywY1mD;o3M@J(AYsAL%ZlAEK$EieII8OXB4M`6TnIQN&Fg4C@eo_ zO%s?V5D}=uIs7?%6=xnW9%lw|GlO{ied_6c3qK9Jae5^h%gO@T6k&-BCH$L7?cw`yl;|kY0A~`O6Q>;I zYHWmXno1G64(D*xB1R44ix?<6Ejr4j(cSnCx`1}kMd}pMCFnuluxyR8QGo%Rgf$q# zX*j!RT=nE<7p2rS`3R>D=b&0_h8Twy?1nZhKo^!4Z<3Yv(B)Cth;pNg&73M&lduM- zVFc@N4yq-r2aH1trk9u@rk9u@rg6HV4INm3CFqx>!Hs!e8oWC{idBIDi2@Q$;?&?Y zoP+W_dNX5a!SvE`RnDiErqqM^ZX6pHpbJaTgZ@&vMd|UpFAYAGAH}M`Nmzr^Fj{KX zDMHUdwT$ke1-qdQon_^dSNpk~gIXeZ$;gaR%bAW|T!)|CpM=00-0vj$Y!V>hLzdWTb+sSFvmR%J%5N9g%=<}kcO9kt%% zv|whv8TvM1qR+;0M8BFJTAwOQgCdp>$EX^hXV;qnWj2_`_6BnhjiCd17|df<4QGCX z8IaXtoJ`BOvIjCPDHZnFI1Y4MOj{RSgdUD3T8@7oYpjKtp{LLxdInt=4rg_%VL~X^ ze6-VQIxa#V1~7zmsFS8n8rn%S6bD^2EL%PsV@bMSplMK}YDlz>Uq|aU(m@9n;fXer z!AFm^rPTEU0Xl>;ZRT<`BYtk6jx$gFvQCjM#hlQ#Jfcm;h#tZ(qJ6ZF4&W3{m@@k{ z#F@dV3uU$1SuLTg7TSSD=)<5)5yCpu9j2Mp!LZOa+CjVMBHBay=m3T=!mp!Mr^%x` z$%#&*ZM4%VpZ|xmE*nJx9@<9-o#SeCUw{tLA-XPlxUY`ZT_!`iYh3w#X|#iO&_#3+ z?W28kfDXFk^Z#%*WFsU{N7vDMqe-ea(gAc}5&E#Q(abMEhp-OQ76YK-Zt7_B(7xfU+QhCAycLb+UI%pi(5o-~m0q60WZoe&*SvyN7qO-;R-RY9lG4sNqxBZEx2!FuYI=)FWTPGNU+OF3csM?~f)3DA!YCKv)N$rVb*+J3h^VHI!+x&Z8aU}t#pP?qiyt%XjxZu5#QUo$sGSa z8v&f6QbeWtRhlJ7%P7%jL``gU^uAl?_DWM$yp#;wN z)uGzX{@ZT4NeJav3y!s&F7a)&v)#0E(M5a@?QiE3CC-@CxqhI6AK=u`A$mrl*Oc=S zRvl|zD4$Puu#7txgit=g;iPdgJ4{j=$H8&sxtW7m7pI8h;dnScP6ele6W~kR;%qpac96&XA{$o-a!w=i)BY zK^i)6NGN-8m+9Vv{w}lN6?8zI8ahPRq25g%Xzw;{9dr@;Fo5CiarO6o;ckxqI+or; z<2@#jMmul_r-=4p07F=Zdar3~?KKyc^xkpxUwvsD2koGXqF417(LN0JHm?6{)M0v` zN#sCxpGj9l`!LvNj^PkJFO-kfJ?x+!y6-U;W(y~clM%{g813R0(H`0tU6%j#u@Mlc zp+j_puA_A?Ytx%j`}%A0VAkPm1QR*)yFUZ%oEeG>JvfG6L(k;QP$IO-o0^Hd9NOiq z&4vp-Sb;Sd<;@yIXw_$$S$)Q_&@S{~1=e5$RX_Ei4PEHL3M|(sA~@e~e&4GB(}5ab zj0488a4ejRIPC*AdPub2=b}A0hEqXLp=-3Q;mqJfI1$c#8B6V_v;8KWh0dUD^bp!b zpFr34n<3hlnH}N66PKB`9=ZZ+FoNoUsVRS2GRFrxgSHQpO<;%(mw*Q=&^&Zk8bBKk zU2ZN%F4}_?Sc5Z{n_t!udLFF~k^$P#g(nW0n%+UK{}rqnoRPqd`3S8J(HPp$g&wTH z8ng~Gjl(9Xi>|;aaURdlzz8QH4=lMcZ`r1PMs)ecyv@cC0T=DrUzP)HOq|E_6?6oZ zV|)wR(1kU}q>G>$WYExt-k{mJH5iFAn2pe?Ab#1hOkrgT=CWg>D+QBc3a5sSpn2-C z><(x{7kWbZ%!97MnIUrtiqMH8MrVX?8?cX<3`00Bx?H2M-e3YYJn;t8pn{$f{U-wv z+B<6Mj2$)Su{}(eLir>(VrapNP|lqzaG(u6q4-xC--Z!X<*TR)ZRkP|R$vWA&^+o{ zQb4!C-!o1PT5lo>UFg9IticGXtLgXZG7Z>pp$99l1|z7hp#ij^3q4qYHK=}{oX~|8 z7(we8QCK;)X}uXc8xd4*mhhRoe*NKNUu*qV>!sHJXzfn!NZQG(k~bvZoBUYvhsl<< zo;Ig#xb51uJ5xVuw>q4TpyTp(VoE!Ii?djjR{GLd^^C`OQgjK6|C%2+s2DMlV0qRF>kG zSC|xy4!VvQ-JR?Z9-*7&d|LGBLs{Y0EhhTztf9kzZic_uY8;Eyvzc9@e^%%b_6`{q zoPOb_4jvSKeq>Piz|NyWGa30#d}B6^?q5HrmOeAa(gBnD?#r(d_7{!|X9r8d#{3#{ z{eNdE^?!NAJA{qtHHLEU(c60Do)D|;P6^yx_+!JNQDN0Kd{5i`LN93saeUD5nX4WZ zUiU_$yLKDiZwJB~4xbl3Rd`z1sN)`fR`i`Lc%%N0cbWPh9=a&Jg2n$8`LU_IHJi zwiErvxr<)H@_~PnjWgMQ7GBlzGvTxOSB0k!{7N{u-E{UxJ4~X+QvX>?T<)28HEU8d z=J%g;Hk(-@{vC}8z(%X^h-o`>Xq7}~2b02$mzkV9$$9PNWfMNdL6<3PlCa*gUC6#s z=Z~6h8cX`)&3jCWOs}x99`_#IFZx}uy7Q3e)2&w+XWMb%>(7+g!J;^g2{fkkyCcRN z|NrNSA-=QKbe}1hQ>$?dzy7FhtkB%+*5-F7mDK;=r`!;S@O;)B$WI@Ay9`JV-`3Op z+u1Z`c4gcD%>L4l9G^<&UEPq-y@^$F--7;?im7+&-w4l4T(?+vZhl-Z(=jzE4~>ke zDZNVggnZ3J?t<6rgiq=X!t)c4EY^GUCnshX>vUOOz@qnw`&lio=2OoKW9m7b7yUV5 zOg*prMSorxQ#HL`bSR9eFKBr|pPClN)QmnT`URofVyq8~{-Q9ZUeu20Sz%0lNf$(a zSr}7`Vn>8aVn?;SRAGH=L^fI`Zd;<;vyNJt*esX2<%z6tWn!Cfbz+BbZDN;jePWNW zrTUpA`Z{^?OY8a8Pq$9DE=!h@k0d9P7n9#ezMT9;a!1=eZGY4DY};4bzTc)( zYf|~tqp7p03#ord&8L2zTGxKC{SVq7ZvS+9qGNSOZ-?9Qu8tpdyw=gtd3|T8^X^W+ z^S;gxb)M^-@BBsQYn`#K9bIqj`dHVRjrVN)$;L(20qc#{4c0rZw%%hUJag+qnZ?!f09&3x-9%)*}O~Jnhtlbm!W%_&NUUiGg$yY3L z>Q?hEV)=KuI>aq|Hf2JcSSasbDF1w+d|;vc%Z2j6g|f0xKE6=?JEc-@(k5?0-hY7YpT?h4QZ!%87;Yk%jWZluCVkVf!-++n?7Tl3V2x za>z9De}AF8FLtP<`uqyLK34ujJg>hQ|MrTz)wfril%GqoeYeW%pT*C%9Z}D;ji?ve zu9WQ~>hIc4symuT)W35x#Csn=qxc-=U7gJ}|Pozw=kEm_!C)G7l zzF&UMwI5ModuJkSUm-{Ph&s@5Qr+BfEb+)O5qW)!n(eqneN}$G({XE}ckzh&=;Gt* zl)5!>N-fiyJMUIUSB$8ib{n8qXyKb&tw@2UEJn`+k?x`;A)59yP$A5!b4{+JoLg9V;?{D_0#)LudY@;s86*{=SanKU#h53AvXcSus`DdLJ>x zhBe-~nCQi8{i*8VC-uIVex`ccdHubn>YJa^4bHOVrhAWn=%zQ_e|z=U@4fw%J0_mHsE_q5xT}8anr!;Ir$6`h z^_y;3_R`{?zA71h`)|#>XzO&kB^IBbc*_^{g{u3KcJ;){7qz!!ztrL^txmkCf1`DO rb>d6>oe24(<9KoCV1haCk`191yP1q4MDQQUF~MKB3mbIqB#2qLaHh32zG zE3-xGHNMKHR{F~HysEy&*k&^a?bbs&pG$pGw0rOW_E8i z)V*z3lls)dbRnV_3-Nn~5NkY6WqD8h4 zi-y4aRaBM0E0PDupaCH2SGxAqZkHiz^6dTG72Bi7IXl;!JRClO{8Q)K!1=A zhJ$Hf7Fd|=DXPIPun!yrvtm8P;cPE)0<_C9iD|%|gS*rI6w#2Qh?l@7um_w17r`}f z8(0P?qBRHyu>)+17=ug+cm~V_3xEph!CJ5Zd=3tP!{8*i0Dc0$g5QD2RfHM%gSNm5 z5Hz z#DQdx1~NbnC;-J^JeUG1!E<0Ss0FrF_}2(t1#f}(!N=e;@D(@&PJr{^D!2vifj{$_ z24@=Bl={iEjZE9iG=88WI)fgXH`UE-&I=or=>8P33Jn^;D_{%Q4n6`0z+rF~JOW;W zFascXkh=@a1UwETgEWu2|~y z<6#tj1>wxfo_AFE|4zMa+$s% z)AwY$Lra_L?nS$U;9GDCTm;v^ZEznb1^E2E3z{kiKtg0bQl=>~&6eq4Ev5QKF@ojC z6&OV+coxh7&x0DU61)gr25*Ax;3M!U*blxb!1I3`ne*T(xCQQkKY2!GcxYadS~%-K3F*5)I=k;Uy%tr8Er+v)vU#hkjCt~{qhJpFuxvmZz;n#UFpovP1DK2Wx3YdDd>;He>BE^@kxu~g z5kDg1p>W#*R#1V0h47=Y!X)@2=A+=x!;i^$9DFhSxb$*3-Ovf?m2f-!r1Y)QPs3A@ zPeFC9!Wk6MOP)RgYH$`#(@9h4fPXJLD3pE1y`|?lix;#_E;=+GX5L91NQZ5>385q;D5mDQU9*&Fa>4g z_ue@Iv14b0oZ*D|Mt>QpSv z^^@Q);KpQon|6$O@o|CXjXGba^YuD^N%41gC}@$nofhZ}umN#Jp+k}oo247zVYEZd zM8RK_K;a=Ptb=c4PIvsOVr-7nbNd?eDez6qpMY;>PG`Z_F<^K9)cy^()8|hGZ@LSl zZ($vTq3kVPe5=mi*7-ZEJq_SpUHm=ibbW0A+jJGS>->G4f1vZf>ik2UyV!te4eV%& zYuDEX@Hbt9k97XA&Og!lPM!aqxfvJS#hhk*x8}B{ML`wz=qh~5oZ_D`rw%@6PVv3W zDZY<6#s9&a;$M*4dW zql55o;3hf1c=#c>S$a445$4q4QRY7IW6UXjoH^c8;)H?|g1bYiaFSJ^4o)$r_-UP= zVLl!4v&^af_srAa=X8Evu|2*c8qoz-f&3zK>hO}zFYEjVo&TuwE6i!eui99F1qDAb zrwd+V-U9wJbJ`t$VNUI@GpF`9nA42jWKMD0EmlAm_?0>KXK|Z3HTaLte`B7H_#L>n zTq9Kfzsv*RcbOw@6ZcqwH!A$j+zb9c=7I2s%xSZE#Jnq97#gGyo6garFK- zvI07CnczP14lXh8i~MuI4{=|1hyKiIKmp8Y4YguUyI~-61HJ!(SV2p8Yqa7Q2xf7* zqc*yDTb+mKyq(TNncL_yieML@HPD_p#jQGzWKQ*?n9~6xnz=7LhB@^Y``B#)gAs9$ z3k0pwc;>YICNQVRCXu-np2R#I-kCXF@CoK^;3>_H`KJ!knhP+!@E*)t!+SCR4kIRS zfivPvI52Te=^-6z+oeM*9Fbtv~H3obE1w({tU2IX%~XnbY@x z{_s}R0sd%JXEUdBe-86_crH9p)~9%$bh^HvDIUlwP=kDUkZkZ2ya3*sU2rJ#mbj}z zcv~4yK>cCNslOuTbfz59ng>lSj z#wIeSMfx;zS`#Ij%l)4UCb0_CV6x6jnN$5KIxo|Cxz4BRd>XlX|1Uy^6(|UkcSuuI z$((kt>C98$Gnvzj%w|q&Xs*Ghxj&kb1%}-X!9(=S7-CRsMxcvzRl`wLfEt zm$m1@=wsK9W~EN(^k_rM^gq*w?JSQ^?L00n!h6E-NoS)PozG-XvU&to1n(TWanIh4 z=l9vCnXEs2vNybOZtLz>#(%agQ8{-Lp^8 zi1Wp6GghlQJ=q_fbn*4}5)no-zLB~vIR5Y`q97^X`;ikXGQ@o?C^C)*JdaQ&XU@=h_o&(hG4sJ z^s+>Ve&`ir?&0W@kvJ6lhNHi8OKn_Wp%CpH1s1a?H;BYxIG{L&JI~i9CXIhGgkDQQ zC@4X+i%9Sl9Sx&{MVUdEhYN%K9miBl#}PQNII5hG!+yW_USg5ktC?pe$R z`$L29ACLN8iv6Z4EL}Y!u;;?FR3D2U?!g?2U2(qs;|b_e4RHD_`_OwL!WJ<}9pe0Q zS?|1O@tF#dtX8GcgJG{%=U7a6*y+@{y@H>{VAX{dAN(j|ZXvoG=3B6*)Av{pqa)Ir z+VyrcBv4wW_IKvh7b_*s*XsKzlbo09OO?s4yyYf?QtB*R8KO*aOZuD9-xjXr+M~O$JlF3WjGlP zRwu?&q?P(~ETxfZNgM(qMlI8N@KwvBsXSYqQ%Gr;V{$R2K91c*w9Y#^4hJ)kDv1wXEb!-_u=7E+NO1k=4kvOd{g#I5K3ocp! delta 7046 zcmZ9R3tSad9>>pIF85x*i@ba*f;>b~7DGiO36+O{hD5#s-=df)DyCA}y)&R9ilJj` z+9s*3`AAc*ZCmPYzFI4{hgz1>L#@nLrDaLlw!i;yF8)8`=kw*9@A?1doHH|L<_uW9 z-Ewf7rLK4J$pJz{JtM@4G$HDIQ7@b~clxYpJb}C@>iC>@xO)Tm*)jmYe!eth2_jdY`r4H7K;!AfFFD<%4n2@ zRv~C0gbjM2+zze)JGcfY<^xhz--!34PWFM0o=C;l=4w08Dk4A}NCf>rI&gulU^h4b zj)EV-JrFktxnK~;1M@*8s0aH&=wPcD0A_>j;5xVsd@`&e48(%3KzOFrC1NwJA^{|W zhrmcM4ouDT6|=xrunX)5!*xNCksI9w-DwV6qE8W`J@~3tk@LJsT<&aTsmyf{(%H-~zY;Zh}Uj;g%(Cd5#h2-lx07o zq$Io@SbfODRxuom1`|Ljm<<*JH>d`6U_ICbwu8OkO>h{z2Tp-=;9@a;Tm`p`0j%P8 zSz7X~!XK|m8azan?PVE-SiDiExLqXW+eLpc5DYQe6_KB>h*6%<7Kg%ugOSt;?|=iw z`w$0sE<`-!tF+Q1V`FgpKkzmqZ5GnJ?tqsm{>>f+pUr$R^XaIEfH{bNDEk`^pNsyy zPA}$i7EgxHbD`lQc>ulHpJe_R^BB~-f%%AkEb}Ab3*e`uKgv7;^*FE)@zXNi0baqp z2i)}(YnY6NrF40|0`H7; zQ-) z>6!3q=9gXAqN(90By`5?s%640csFd=mC}EPpN9VdUyl6Svcn{_k>7!Tg4ilh18fi)(ioeU8;_or1`1{N$eiFCH?)t&no!*^A12Ad}d1c+~nt&&qn@v z=G0*W^S;4&1!`CcFS}R+4fs9t z7Vs;~X?MKJoI1G1oQ}WFoUZ5%<`n;dIrZ=Qku}i%{1bCJ;HJrMF&~Qf&u|A@#J@17 z53k$IslQ*D`_caY8*8v3p^0q`j1)L%4n%tgf9cbA}58hgLN z*nYb*r^lu{^9Xo6^8xS#<}_e0=562)FsJ_dG&`<8B_uaD2+<0j!u%AbOdfzWunDm- zGTs8d2lZU(PIxh1u?M9G!b{*Dcz+xp1gC%WCH$b*>HgDmo#t&oou2D-=Jb2OAb7Cs zfL3(|bNcSjWZo5?4G)p|6d%HzK5%lR)A)i8$U{S@JfIjp3?9Y?%x4~mvlBja(% zFJMmnJ;I#6DIaBi7CsW*R`D^$H!dqRv_psVnH>p6!`sUN=rMbYIlUK(nbQ>;&zu(N z1m?6RCYpSb;d1|{117Ts@+r)zgA$WZHTg7?mzw->=7s2Q2E2oJ|EEhdlN#h1)9zKq zJPAIBIbD%*=Cp?9Tl|}krz=vy+!y{7^9cCUaF=&LI>SXQfqb#apJ7hFZn>CKzMDC{ zYE|a+tDD9=1zu_Kci}hlrpJOFyDB7jojP2?JRZK3Io+aV%qhRxG4BCiN0-oh#t)%kJ#)IJ8<^7s zU$lfa=hK^WBXfF@)ibB~OU&ubw;5~3J04vT-!0VO$w|Iz_2fQyRf*Cw=?zX77k}K$ z3`9w9ctwoMqVuIG+4NCqwPAO{?IJjHbfjH8HuUXuhnRrZpy$`LDqBRt6k!@n1dvQg_;&FR--CY*FuT{@r=|ZdEf0OY<;wAd`is$3D~4Ko{#m=~MAoi_MLRYgFKStv zx>-Hk0}FfC+7D~aqzAq8W5C_O<9`clm@=R`(KBU8&lFd9nllI=1QqmMVIA0+3g5vA zRHSD1w)MwGlHG@_TTTLG({${NJ(^1HZH|&>_J>avJt53pMEZ-}U^UShj(tJcG0lEzpEUZ5Sg@L+Us@U) zI$VhMYKGGxN-ZM30N)&HuHJE3eDtFa(p?NyM`P}ZA}&CTwTy8*A}sD5>Nsb2yp>w1 zQ}ps>F&Wr1BGocL&T|7&Jet? z91)__S}|@EzA4mNy;b+jLCoPnZ;x?L}=?(RpsS_jx+{e|j8TM_n1 z^{oDJ^?-rJn9gqXJEs%ViB_*W9TxXJiwGKve4FC_LA~wl1-*cSsWd( z!Bx257>6!3o1VXXpWk?dono?LMD zZFQtFTW`0fmoi7sThm>ctIuE4=sK57y^qm?6R7mlx=f(bsdagp%1|vSiOK@4w-Ilx z^~ohK)A}Y-IZI3KMZwY&^EAXv*UrK=gB<-3>I zr()wCrj6)Ikq~WU43&}Es8|Fsd;d;^9o{IQCj1MqB diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Logging.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Logging.dll index 20215ab3b8250723843c42bd19b9413638e866e1..78029aca3cf1f7ff53d0898443008bfb07711369 100644 GIT binary patch delta 167 zcmZoLX)u}4!QvD8o8-CHsMP#3_r>dz zSxizDpn{Qap@KlwIvx`(>ciLa&9ZUTRodKX!pg*H#lXP82*g&Kr<+MLFggC2vyWf*{_W~29k`HllMxhGFonaEcr`_f4@@gooVepTW^azem67y{pL41 zi&*&0^$ZvoxEUGP4D}53OwBjXHDqRD`Oj3ad-4+F0D;_k{|mcZ|M_fo3xCFFIVXHF zi%F^iOwbrA2vXhqx5B+g`%9OqK7Z5ZP7_upPD=&`21X#Z+&tY(nu*bT^Ja_HjEv@! YaJ#XPBL_Nr;v3c@_#0Y;ds`vR zFJCEa1ds5X;o@A%VGL%RYrL+3(oqEf0IihIYTQ5!#_xfB2jNpfn{j$5g|qDkUj!Ig zIH7<5Kmq`YwU(2$mc>ehuZqx-Igt>PWDFx1SJ()h00031E&cTooHX4-ga2iAelo1F zlb;M1M4+Y`v;cqr0R1XI0kXjYN08I1;aIRj)JI`$WkYprbS_P0b7(GPY-|7k0nb5+ z)d0W>07#PMUh0@SL6W@}+4+G9%9HvG8W?@)F^>RX2mnAAP`VIs?n;4kUh@&WSUs~W G4U8e@EN!O% diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.dll index 124537423c740810cfae333a05756187168d11fa..3880dc313ce8364ff1ee70e2946ec7c80280755a 100644 GIT binary patch delta 256 zcmZozpxLlMb3zA8!``{`8hcuM7+ZUoT6>sVdstd~SX+D8w)U{IxG`EypXkPJENjJp z0JC=>*o;7?)%1sM?9z-@?SI|axBqqHNdG2KEPf>G>BeiWvt}*#OFjBLcX^2|=S_YK zJp%>?Zbk++Lp=jMQ;Y4*VqCd;EEaxMU#EX@;R+CVKd+5T_rGymv#O%HM9 z@>PI}9#(~lg4AC%v5H#dcCmi@{-(g~2VJ?&GI4@j2zJf(=^k9dOpF%WS9@_KGcsCC b=l9_tIf2MzN;R+Dg?SHa9;`v**X6r1YnjdR6O%HM9 z@>PI}svU-kg4B1ZG}Lc%++=*hf_umIgRWd>nK(f%1iNPYbPq0JCPwq^tG&3A85zx| b^ZRg_vzjyLF&Jz&bmQ8_xSi3D>pvp^4eVAw diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.pdb index 39ae7b7cb37edcc01c718d02e903a34548d7086b..b980c4a82d46852e370262b3ab53742e9f30e131 100644 GIT binary patch delta 369 zcmeBp$=UIeb3%>C`*|Imp8na+OK&^~oB2n_%fhefYvY8i6Bs3f6?nG4D|{c3aoVuW z>PYdXn|kgGKmGhB-Szm7ko4A-ZkkNnPX;sUGbsdS$tde?Y7b(m;0!XC>wVeYWY)8h zZ$_Mq)c#4U68?VPE)mAa#Hes#uj4B1Bk#J7=IwW~_WZLg;g~J|y?a?49DWjw9qVOQ zZMO<%bYfLl?%)})YVW)g8nOKAY8-9eo)p;|@#=2Db^br4X7_%d%%46dhEamCY5Ud~ z#vT?4pZUw~GdM6Y9NR1x+w`8@Z*5uU)N=>6F-%|Bz$jC%my(miz`&TVzN`^QF_^!3 z5@x1T=e1bA_++ch-NWvQxv9>jIVE~N`RVDIdFfE)KA}%eGc+(TEYZKM{P35xTkG~M zovHtBCBc>ZrIwWE7iA-Kycf~^#*o0lVEB8fkNNQ!za7@!ik6k}F>Y@En#j2QYa-KR FApj$mo*@7L delta 369 zcmeBp$=UIeb3%>CZvT_@5zpVcHCtyH)%;kqN%}?UpT-GWCooC|E1XTpmbMEQeskiD z$=sXEUt9Lv{FJgSDd@b@-^zJg`99=qKN-xZ&!iCWD>L^m`;C9|dKZ@GEnl&6$I*$w z3@b9OGbPR6|Enh9_jZXeMkYpunI{d3Crf2p%qVO~TDIu@fpZTcnYz3aYk5QT|EM(l z_1tb1&gjIdaCW=WTD!CJO58daSq+Qy6BOEbEUxU1d}`B{p;*@bzij%P7)A+3rR`f| z7<*VGA}tm+FgP$VbZwnBdF!;JUM=gpE=;tXC@_6t1EWm6UP?|50|R6D4UV}$ib419 zSHU?Zcb%L6rS4qNrz>#feyJtp`9;|X9knkF`xz2A7#zd{b_o=`^J*-P`z*L8g3-49Ya-+JuZc{P Fg#fL3pA`TA diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.WebSockets.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.WebSockets.dll index 0a2e32de7dc72e18cc73dc8b3fca7792774f4c51..45230ea931b5b01fd08fd48c01233ec5ad889978 100644 GIT binary patch delta 197 zcmZoDX(*Y{!P40;zjcFB^CJv?nLw+Z~W8jv?_dl#QPml_cjM; z2(yY>=ov6Da5FNn8R{A6nOZO~C^It1O+F|uJlVm3d-F8icZ@8YM|~bm?$8eqFx3p! zPd4K9>HqTBu*X#5|Ku0?`3g|Mp7T&akm{9Y4MH=lZtdMXd&|tt8uthI$5irsfO`%8U$hlMl)ZPj)ci-aJkB9V5#^cE4GZJM;qt9`G9e z&6&H#VG+A0v%lpxjmac}eN2vFGM;192u!O9lo8Mj*D_ nJl%+!iP3!XVw3ZXjOLSz&CFTN8T1$oHVaw=F>YqG_|FIcHvm7I diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.dll index 6ec371913b3139d7f9929774622e107cdb2420d9..2e708bf5f4ace4dfd448268b98ed4f23c8a9a92c 100644 GIT binary patch delta 237 zcmZo@P-tjSn9#xUUPSj>V^3=jV`~pnYY+3*9u}q_j8@b8f3U;?skc8^^nsM@PZn`T zt9H|$EZa?gvc9etF#NsL$NYGV-wx|tX)(z&Gr+Je-yc3=E7wY`J~<5BA55jON>`f3dd%>FLaW Z*v(nZ8T1$owhR7aKg_tD=^y()MgU$ET3i4C diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.pdb index 136641cc628561d9c5aa9725c2bfa4d115becf02..18389098bb6432677995dfaec93bd6444dce4952 100644 GIT binary patch delta 337 zcmV-X0j~b=ix2RN50HEmZLW?UyL5I-oY;De2&6uxDc9f5fsnP30mLmJySKgQVRDGE zEz%2yL{G^icmt0K3eWXLip!B_DhZ*wmvk-xvLHJK7clzP0 zbF{>hlYuW4z8}jJa;{bv0E13`_}*;wsnsH$2g3wIw~H?U zs0BJus=9^60-TE&OrNIT06+o&#g6{`Tt#*l(&cL<+mm$FdBS&v1 zrhxze0RT7bf7XI-Y+fsnP30mLmJpMeC#aV*FJ zuHk&Zt>5wvV-)9rMYUo&RviALiHDD+@+q6Fr%$e-@CXGq&=49Ar5z-AA3)-~|hyw_Lx+4Vu0IihWYTG~%h3^A- zhrw4Z#8P@u3Wseq0k>^60-TE&SvaA906+o&inW%LwU)(7gs+OwkvWkNmm$FdBS%-* z2%P``0RS!i^%0yj-9v-_Wp;ittg%O7ZDm7sY;-P6Z)ay|Zf7oJY-|7k0idQDv;cqr j0R1XI0kXjYN08I1;aIRj)R&D=0~&{=!2-9X!2?SKVV994 diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/gamecult_mesh_quic_native.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/gamecult_mesh_quic_native.dll index a58ef10c1ae2b4004597e7cbc560b6a0c2b5e49b..06a43172c0ed5d51c555db088f6fab78e29a79dc 100644 GIT binary patch delta 27 fcmZqJ!_=^cX@dYGv!?5c&BBa{Nnl2Ka;FslfT0OW delta 27 fcmZqJ!_=^cX@dYGv+S4Un}rz@lfaDf Date: Mon, 14 Sep 2026 21:34:23 +0200 Subject: [PATCH 14/94] Write an unset CultRecordRef as "" in every position 452f928 made nil the unset wire form, including dictionary keys: a Dictionary, float> holding the empty key encoded it as C0. Python msgpack refuses nil map keys under strict_map_key, its default, so cultcache-py cannot decode such a record. Nil cannot be the one canonical form; "" can, and every runtime reads it. The writer always writes "". The reader still takes nil as unset, because 452f928/b85a828 stores and Aetheria's Cut 9 import wrote nil; such a record converts to "" on its next save and is byte-stable after that. The store-composition contract names "" for value and key position, requires readers to accept nil, and tells other runtimes to write "". The tests pin payload bytes, so each claim is consequential: an unset ref writes "", reloads through a fresh cache and resaves byte-identical; a nil-written legacy payload reads as unset and resaves as ""; a ref-keyed dictionary with an empty key writes "", reads back unset and resaves byte-identical. The nil writer fails every byte assertion, a reader taking nil as a set key fails the legacy pair, and a reader taking "" as a set key fails the read-back assertions. Co-Authored-By: Claude Opus 5 --- .../CultRecordRefFormatter.cs | 11 +-- .../Contracts/cultcache-store-composition.md | 16 ++-- .../SerializationOptionsTests.cs | 74 ++++++++++++------- 3 files changed, 59 insertions(+), 42 deletions(-) diff --git a/src/GameCult.Caching.MessagePack/CultRecordRefFormatter.cs b/src/GameCult.Caching.MessagePack/CultRecordRefFormatter.cs index 1aa0968f..5a8ac630 100644 --- a/src/GameCult.Caching.MessagePack/CultRecordRefFormatter.cs +++ b/src/GameCult.Caching.MessagePack/CultRecordRefFormatter.cs @@ -3,15 +3,12 @@ using MessagePack.Formatters; namespace GameCult.Caching; -// An unset reference (the empty key) is nil on the wire and default(CultRecordRef) in memory; a "" read from older -// stores is the same unset reference, so load then save is byte-stable. +// An unset reference (the empty key) is "" on the wire in every position, map keys included (other runtimes refuse nil +// map keys), and default(CultRecordRef) in memory. Nil, written by 1.0.58 stores, reads as unset and saves as "". public sealed class CultRecordRefFormatter : IMessagePackFormatter> { - public void Serialize(ref MessagePackWriter writer, CultRecordRef value, MessagePackSerializerOptions options) - { - if (value.Key.Value.Length == 0) writer.WriteNil(); - else writer.Write(value.Key.Value); - } + public void Serialize(ref MessagePackWriter writer, CultRecordRef value, MessagePackSerializerOptions options) => + writer.Write(value.Key.Value); public CultRecordRef Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { diff --git a/src/GameCult.Caching/Contracts/cultcache-store-composition.md b/src/GameCult.Caching/Contracts/cultcache-store-composition.md index b24c83b3..ab028fca 100644 --- a/src/GameCult.Caching/Contracts/cultcache-store-composition.md +++ b/src/GameCult.Caching/Contracts/cultcache-store-composition.md @@ -239,13 +239,15 @@ another runtime need not obey the `storedAt` rule. ## Record references A record reference is its target's key string. An unset reference, the empty -key, is **nil** on the wire, never `""`. A reader takes nil and `""` as the same -unset reference and writes it back as nil, so loading and re-saving an unchanged -record is byte-stable. In C# the unset reference is `default(CultRecordRef)`, -equal to one built from `""`; `CultRecordKey.Value` is never null. Rust, -TypeScript and Python have no reference type: a reference member is a string in -the consumer's own payload value, so a consumer writes an unset one as its -language's null (`null`, `None`, `Option::None`), not as an empty string. +key, is **`""`** on the wire in value and map-key position alike. Nil cannot be +the form: msgpack readers in other runtimes (Python under `strict_map_key`) +refuse nil map keys. Readers must also accept nil as unset, because C# 1.0.58 +stores wrote it; the writer always writes `""`, so such a record converts on its +next save and is byte-stable after that. In C# the unset reference is +`default(CultRecordRef)`, equal to one built from `""`; +`CultRecordKey.Value` is never null. Rust, TypeScript and Python have no +reference type: a reference member is a string in the consumer's own payload, +and a consumer writes an unset one as `""`. ## Value-type encoding diff --git a/tests/GameCult.Caching.Tests/SerializationOptionsTests.cs b/tests/GameCult.Caching.Tests/SerializationOptionsTests.cs index ff17d598..1b6dfe16 100644 --- a/tests/GameCult.Caching.Tests/SerializationOptionsTests.cs +++ b/tests/GameCult.Caching.Tests/SerializationOptionsTests.cs @@ -38,41 +38,47 @@ namespace GameCult.Caching.Tests Assert.That(Convert.ToHexString(payload), Is.EqualTo(InteropNotePayloadHex)); } + // An unset reference is "" (A0) on the wire. Legacy is the same record as 1.0.58 wrote it, with nil (C0). + private const string UnsetRefPayloadHex = "93A6686F6C646572A0A56F74686572"; + private const string UnsetRefLegacyPayloadHex = "93A6686F6C646572C0A56F74686572"; + // A ref-keyed dictionary whose unset key is "" (A0): msgpack readers under strict_map_key refuse a nil key. + private const string RefKeyedPayloadHex = "92A6686F6C64657282A5616C706861CA3E800000A0CA40000000"; + [Test] - public async Task UnsetRefReloadsAndResavesByteIdentical() + public async Task UnsetRefWritesEmptyStringAndResavesByteIdentical() { var path = Path.Combine(Path.GetTempPath(), $"cultlib-unsetref-{Guid.NewGuid():N}.cc"); var registry = CultDocumentRegistry.ForTypes(new[] { typeof(UnsetRefHolder) }); - byte[] Payload() => CultDocumentMessagePackSerialization.DeserializeSnapshot(File.ReadAllBytes(path)).Records.Single().Payload; + var key = new CultRecordKey("holder"); try { using (var seed = new CultCache(registry)) { seed.AddBackingStore(new SingleFileMessagePackBackingStore(path)); - await seed.UpsertAsync(typeof(UnsetRefHolder), new UnsetRefHolder { Name = "holder", Set = new CultRecordRef(new CultRecordKey("other")) }, - new CultRecordKey("holder")); + await seed.UpsertAsync(typeof(UnsetRefHolder), new UnsetRefHolder { Name = "holder", Set = new CultRecordRef(new CultRecordKey("other")) }, key); await seed.FlushAsync(); } + var written = Convert.ToHexString(StoredPayload(path)); - var written = Payload(); - CultRecordRef unset; using (var reopened = new CultCache(registry)) { reopened.AddBackingStore(new SingleFileMessagePackBackingStore(path)); await reopened.PullAllBackingStoresAsync(); - var loaded = reopened.Get(new CultRecordKey("holder"))!; - unset = loaded.Unset; - await reopened.UpsertAsync(typeof(UnsetRefHolder), loaded, new CultRecordKey("holder")); + await reopened.UpsertAsync(typeof(UnsetRefHolder), reopened.Get(key)!, key); await reopened.FlushAsync(); } + var resaved = Convert.ToHexString(StoredPayload(path)); - Assert.That(Payload(), Is.EqualTo(written), "an unset reference loads and re-saves byte-identical"); - Assert.That(unset, Is.EqualTo(default(CultRecordRef))); - Assert.That(unset.Key, Is.EqualTo(new CultRecordKey("")), "default and \"\" are one empty key"); - var legacy = MessagePackSerializer.Serialize("", CultDocumentMessagePackSerialization.Options); - var read = MessagePackSerializer.Deserialize>(legacy, CultDocumentMessagePackSerialization.Options); - Assert.That(MessagePackSerializer.Serialize(read, CultDocumentMessagePackSerialization.Options), Is.EqualTo(new[] { MessagePackCode.Nil }), - "a \"\" reference reads as unset and writes nil"); + var legacy = (UnsetRefHolder)CultDocumentMessagePackSerialization.DeserializeUntyped(typeof(UnsetRefHolder), Convert.FromHexString(UnsetRefLegacyPayloadHex), registry); + var legacyResaved = Convert.ToHexString(CultDocumentMessagePackSerialization.SerializeUntyped(legacy, typeof(UnsetRefHolder), registry)); + + Assert.Multiple(() => + { + Assert.That(written, Is.EqualTo(UnsetRefPayloadHex), "the writer writes an unset reference as \"\""); + Assert.That(resaved, Is.EqualTo(UnsetRefPayloadHex), "reloaded through a fresh cache, it resaves byte-identical"); + Assert.That(legacy.Unset, Is.EqualTo(default(CultRecordRef)), "a nil reference reads as unset"); + Assert.That(legacyResaved, Is.EqualTo(UnsetRefPayloadHex), "a nil reference resaves as \"\""); + }); } finally { @@ -81,31 +87,40 @@ namespace GameCult.Caching.Tests } [Test] - public async Task RefKeyedDictionaryRoundTrips() + public async Task RefKeyedDictionaryWithUnsetKeyRoundTripsByteIdentical() { var path = Path.Combine(Path.GetTempPath(), $"cultlib-refkeyed-{Guid.NewGuid():N}.cc"); var registry = CultDocumentRegistry.ForTypes(new[] { typeof(RefKeyedHolder) }); var alpha = new CultRecordRef(new CultRecordKey("alpha")); - var beta = new CultRecordRef(new CultRecordKey("beta")); + var handle = new CultRecordHandle(new CultRecordKey("holder")); try { using (var cache = new CultCache(registry)) { cache.AddBackingStore(new SingleFileMessagePackBackingStore(path)); - await cache.UpsertAsync( - new RefKeyedHolder { Name = "holder", Weights = new() { [alpha] = 0.25f, [beta] = 2f } }, - new CultRecordHandle(new CultRecordKey("holder"))); + await cache.UpsertAsync(new RefKeyedHolder { Name = "holder", Weights = new() { [alpha] = 0.25f, [default] = 2f } }, handle); cache.FlushAllBackingStores(); } + var written = Convert.ToHexString(StoredPayload(path)); - using var reopened = new CultCache(registry); - reopened.AddBackingStore(new SingleFileMessagePackBackingStore(path)); - await reopened.PullAllBackingStoresAsync(); - var loaded = reopened.Get(new CultRecordKey("holder")); + Dictionary, float> weights; + using (var reopened = new CultCache(registry)) + { + reopened.AddBackingStore(new SingleFileMessagePackBackingStore(path)); + await reopened.PullAllBackingStoresAsync(); + var loaded = reopened.Get(handle.Key)!; + weights = loaded.Weights; + await reopened.UpsertAsync(loaded, handle); + reopened.FlushAllBackingStores(); + } + var resaved = Convert.ToHexString(StoredPayload(path)); - Assert.That(loaded, Is.Not.Null); - Assert.That(loaded!.Weights[new CultRecordRef(new CultRecordKey("alpha"))], Is.EqualTo(0.25f)); - Assert.That(loaded.Weights[new CultRecordRef(new CultRecordKey("beta"))], Is.EqualTo(2f)); + Assert.Multiple(() => + { + Assert.That(written, Is.EqualTo(RefKeyedPayloadHex), "the unset key is written as \"\""); + Assert.That(weights, Is.EqualTo(new Dictionary, float> { [alpha] = 0.25f, [default] = 2f }), "the unset key reads back unset"); + Assert.That(resaved, Is.EqualTo(RefKeyedPayloadHex), "reloaded, it resaves byte-identical"); + }); } finally { @@ -113,6 +128,9 @@ namespace GameCult.Caching.Tests } } + private static byte[] StoredPayload(string path) => + CultDocumentMessagePackSerialization.DeserializeSnapshot(File.ReadAllBytes(path)).Records.Single().Payload; + [Test] public void DeclaredResolverEncodesValueTypeAsPositionalArray() { From 29bec57021c091f7bb16f33d77ed964659181764 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 14 Sep 2026 21:34:23 +0200 Subject: [PATCH 15/94] Decode an edit's Record from the bytes its Document came from BeginEdit cloned Document eagerly but Record lazily from record.Document, so a cache change in place before Record's first read made the two copies come from different states. BeginEdit now serializes the document once and deserializes Document from those bytes; Record deserializes the same bytes on first read. Record is the state the edit began from, and costs one deserialize only when a drawer reads it, with no second serialize. Each commit still spends the edit, so a slider drag begins an edit per frame; that serialize was already paid for Document, and Record adds a deserialize only in frames where a drawer reads it. The new test mutates the cached document between BeginEdit and the first Record read; it fails on the lazy clone. Co-Authored-By: Claude Opus 5 --- src/GameCult.Caching/CultInspectorModel.cs | 6 ++++-- .../CultInspectorModelTests.cs | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/GameCult.Caching/CultInspectorModel.cs b/src/GameCult.Caching/CultInspectorModel.cs index aaa7bbaf..6a86f5ee 100644 --- a/src/GameCult.Caching/CultInspectorModel.cs +++ b/src/GameCult.Caching/CultInspectorModel.cs @@ -252,7 +252,8 @@ namespace GameCult.Caching public object Document { get; } // The record being drawn, as stored when this edit began, for drawers that read the document they sit in. It is a - // second copy, made on first read: not the cached object, and not Document, which a lowering commits. Nothing + // second copy, decoded on first read from the bytes Document came from, so a cache change in between cannot split + // them: not the cached object, and not Document, which a lowering commits. Nothing // reads it back, so writing to it saves nothing and changes neither the edit nor the cache. public object Record => _record ??= _snapshot(); @@ -353,7 +354,8 @@ namespace GameCult.Caching { if (record == null) throw new ArgumentNullException(nameof(record)); var type = record.Descriptor.DocumentType; - return new CultInspectorEdit(record, Clone(record.Document, type), () => Clone(record.Document, type)); + var snapshot = _serialize(record.Document, type, type); + return new CultInspectorEdit(record, _deserialize(type, snapshot), () => _deserialize(type, snapshot)); } // Whether CreateDefault makes a value: a string, struct, list or dictionary, or a concrete class with a parameterless constructor. diff --git a/tests/GameCult.Caching.Tests/CultInspectorModelTests.cs b/tests/GameCult.Caching.Tests/CultInspectorModelTests.cs index 1de5eaf8..7ce19824 100644 --- a/tests/GameCult.Caching.Tests/CultInspectorModelTests.cs +++ b/tests/GameCult.Caching.Tests/CultInspectorModelTests.cs @@ -199,6 +199,18 @@ namespace GameCult.Caching.Tests Assert.That(none, Does.Contain("cannot serialize")); } + [Test] + public async Task RecordIsTheStateTheEditBeganFrom() + { + using var cache = new CultCache(Registry); + await cache.UpsertAsync(typeof(InspectItem), new InspectItem { Name = "original" }); + var record = cache.AllStoredDocuments.Single(); + var edit = Model().BeginEdit(record); + ((InspectItem)record.Document).Name = "changed in place before Record was read"; + + Assert.That(((InspectItem)edit.Record).Name, Is.EqualTo(((InspectItem)edit.Document).Name).And.EqualTo("original")); + } + [Test] public async Task RefusedCommitLeavesTheCachedDocumentUnchanged() { From b03118db2cd10534eae2150254d620e4b9d1519d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 14 Sep 2026 21:34:23 +0200 Subject: [PATCH 16/94] Space the Studio drawer's ReplaceKey and FreshKey arguments Co-Authored-By: Claude Opus 5 --- .../Assets/Caching/Editor/CultCacheStudioDrawers.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/GameCult.Unity/Assets/Caching/Editor/CultCacheStudioDrawers.cs b/src/GameCult.Unity/Assets/Caching/Editor/CultCacheStudioDrawers.cs index a421a476..2b4a87cb 100644 --- a/src/GameCult.Unity/Assets/Caching/Editor/CultCacheStudioDrawers.cs +++ b/src/GameCult.Unity/Assets/Caching/Editor/CultCacheStudioDrawers.cs @@ -245,7 +245,7 @@ namespace GameCult.Unity.Caching.Editor var item = DrawValue("Value", shape.ValueType, entries[i].Value, member, path + "{" + i + "}.value"); if (EditorGUI.EndChangeCheck()) { - key = Model.ReplaceKey(_edit.Document.GetType(),shape.Type, entries.Select(e => e.Key).ToArray(), i, key, out var notice); + key = Model.ReplaceKey(_edit.Document.GetType(), shape.Type, entries.Select(e => e.Key).ToArray(), i, key, out var notice); Notice(path, notice); entries[i] = new KeyValuePair(key, item); changed = true; @@ -264,7 +264,7 @@ namespace GameCult.Unity.Caching.Editor if (Add(shape.ValueType, path, out var created)) { - var fresh = Model.FreshKey(_edit.Document.GetType(),shape.Type, entries.Select(e => e.Key).ToArray(), Records, out var notice); + var fresh = Model.FreshKey(_edit.Document.GetType(), shape.Type, entries.Select(e => e.Key).ToArray(), Records, out var notice); Notice(path, notice); if (fresh != null) { From 2053ab740dbd6638129a8e538f7a34c278670106 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 14 Sep 2026 21:34:23 +0200 Subject: [PATCH 17/94] Build the native QUIC connector reproducibly with /Brepro b85a828 changed x86_64/gamecult_mesh_quic_native.dll with no native source change. The two copies differ in six bytes: the PE header TimeDateStamp and the debug directory timestamp. The MSVC link stamps the build time, so every -UpdateTemplate run rewrote the committed DLL. /Brepro on compile and link replaces the timestamps with content hashes. Two clean builds from an emptied build root now produce identical bytes, and the DLL embeds no build path. The committed DLL changes once to the reproducible form; after that the release byte check covers it like the managed plugins. Co-Authored-By: Claude Opus 5 --- native/GameCult.Mesh.Quic.Native/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/native/GameCult.Mesh.Quic.Native/CMakeLists.txt b/native/GameCult.Mesh.Quic.Native/CMakeLists.txt index 2850951d..dcb3014c 100644 --- a/native/GameCult.Mesh.Quic.Native/CMakeLists.txt +++ b/native/GameCult.Mesh.Quic.Native/CMakeLists.txt @@ -14,6 +14,9 @@ target_compile_definitions(gamecult_mesh_quic_native PRIVATE GAMECULT_MESH_QUIC_ target_include_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_ROOT}/include") target_link_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_ROOT}/lib/x64") target_link_libraries(gamecult_mesh_quic_native PRIVATE msquic crypt32 bcrypt) +# The DLL is committed beside its source, so a rebuild must reproduce it: /Brepro drops the link timestamps. +target_compile_options(gamecult_mesh_quic_native PRIVATE /Brepro) +target_link_options(gamecult_mesh_quic_native PRIVATE /Brepro) set_target_properties(gamecult_mesh_quic_native PROPERTIES OUTPUT_NAME "gamecult_mesh_quic_native" From a0813c6eed24d30bf88073ef615b633c77ebfcd6 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 14 Sep 2026 21:35:34 +0200 Subject: [PATCH 18/94] Release CultLib Unity 1.0.59 and the Studio 1.3.1 Corrects the 1.0.58/1.3.0 release. Rebuilds the tracked plugins with scripts/build-unity-package.ps1 -UpdateTemplate so they carry "" as the unset CultRecordRef wire form in every position (nil still reads as unset) and the edit-start Record snapshot. The native QUIC connector changes once to its /Brepro form; later rebuilds reproduce it byte for byte. The Studio package moves to 1.3.1 and depends on cultlib 1.0.59. Co-Authored-By: Claude Opus 5 --- .../Assets/Caching/package.json | 4 ++-- .../Plugins/GameCult.Caching.MessagePack.dll | Bin 41472 -> 41472 bytes .../Plugins/GameCult.Caching.MessagePack.pdb | Bin 18940 -> 18924 bytes .../Runtime/Plugins/GameCult.Caching.dll | Bin 118784 -> 118784 bytes .../Runtime/Plugins/GameCult.Caching.pdb | Bin 38024 -> 38032 bytes .../Runtime/Plugins/GameCult.Logging.dll | Bin 6656 -> 6656 bytes .../Runtime/Plugins/GameCult.Logging.pdb | Bin 9256 -> 9256 bytes .../Plugins/GameCult.Mesh.Quic.Native.dll | Bin 15872 -> 15872 bytes .../Plugins/GameCult.Mesh.Quic.Native.pdb | Bin 11960 -> 11960 bytes .../Runtime/Plugins/GameCult.Mesh.dll | Bin 675840 -> 675840 bytes .../Runtime/Plugins/GameCult.Mesh.pdb | Bin 160904 -> 160904 bytes .../GameCult.Networking.WebSockets.dll | Bin 14848 -> 14848 bytes .../Runtime/Plugins/GameCult.Networking.dll | Bin 524288 -> 524288 bytes .../Runtime/Plugins/GameCult.Networking.pdb | Bin 247280 -> 247280 bytes .../x86_64/gamecult_mesh_quic_native.dll | Bin 40448 -> 40448 bytes unity/org.gamecult.cultlib/package.json | 2 +- 16 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/GameCult.Unity/Assets/Caching/package.json b/src/GameCult.Unity/Assets/Caching/package.json index 2717cdeb..016a25e9 100644 --- a/src/GameCult.Unity/Assets/Caching/package.json +++ b/src/GameCult.Unity/Assets/Caching/package.json @@ -1,7 +1,7 @@ { "name": "org.gamecult.caching.unity", "displayName": "GameCult CultCache Unity Tools", - "version": "1.3.0", + "version": "1.3.1", "unity": "2021.3", "description": "Unity editor tooling for inspecting and editing CultCache .cc stores.", "keywords": [ @@ -10,7 +10,7 @@ "Data" ], "dependencies": { - "org.gamecult.cultlib": "1.0.58" + "org.gamecult.cultlib": "1.0.59" }, "license": "MIT", "category": "Scripting" diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.dll index 7d73acbb9a6fc16af8565ecbc961e094781d1e1e..d57846bb430c3bd533735cbb969ef9f3cffc558f 100644 GIT binary patch delta 14092 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 QKXYhCKfuGHqo?=(13d#(0ssI2 delta 14056 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 S|EHk`y6y-)a6+_naQz=+*KW!H diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.pdb index 59e5f71226182f2dd174e0053530de4871e619ec..55eaa33b0435a3b361d9d4c8fd733d3486a7fa96 100644 GIT binary patch delta 1406 zcmX}r4KUPc90%~{+1>t#4S5%}UYE;~Teh@yh}0Glj;51K&f#1r*15`Tjmk-R+X}sq zF16>@mD$V7Rhv|kP9xWxt8;m~#(9}8MJKb7`;zHD^O^7O`9II^|MJZLKPjir<+L!B zXC)%UZq3&zI|w0a^GP4`Gz&lZ-t|>Mo;MmsCM1$c7_O1f@^`7oldhheduyJp{&1Y_bThLOVQ$K^TE4;5f6%5^#joum!$=W@omH ztow*f5}*;Rm$J!S&_KEio9u^tI0@x&(S<{Pf*#NS6);2_n&2L^K?gjAXQ1WA5G!y8 zUkC%kWel-{E6})1#*kYm?!#~JFZ>7ZfalJT`Y~FlrI3hP4m~VRLg^=Q3k1i|0~M>G{6-hqAOeIS(j_=A@4_0K?gFhl>%?7))lzy%hY-B;hLJ~OGJyujmaxu4dZJ1<(N zY0gOC?VT(+s&AQPctU!%CM;J^P$%b^naf_c+Z%_L9Q5JZWOVrr#zcs(iT!_cKlSIq ztPARZ3T4ZtV_o*W`=tg-kFlv!pLaSRdF6ZW)#lAjUgM6>4%<3-RI8PyW2N=V-YVNn z|3g9KIGb0xKGiGT=#xZu(S_}-lftA09P0(WwUMm+=uq2~kkCAR7oBAhFI#MUBnJL6 zZbNswvg)d6seR{nm+kwmXZAhFsrzR_5t+|@z<3U~Wq5Z9Iu2Z~y`!?)lT-csiI^2x zi+f$m#~mLD+!vUAncLbu*rl-Zt7v~x&^_IGdSOzs=8VIxJn6;*Awz<5{e=yQJ9S3~ zmIvN9Fg2D+y`%r$6IT49;9bD5k=wMm&q1bTS)vHPbv(Sba?$HIA?I&CY^#>oDjaTI z&=>jks4Gh!M29@ucDLZgoh;4sP2&Sm_qK-CkDA_2YMR=$TvFYgBHnk%x?dCJS{VDR zPWhxl9Iu<6I&7nNra0!%VX<49^RJGH6GhE~?4w&%Rpq8@Z~rk~HTKA4dcM=>>$9zo zIcwe~JS}Ryxln6^aD)DHNte`PgJHJomPS2~60^WEd8fwYa%W3N#>Q4|{K~hTX^P(X z9pC4Mr|d^?C{W2JF|XPeitTb9!a6>g3{Z ztECJ+KWkkb)1bJtw3zs~keJvc*MOAWJ7dz*<94Sp^rD7dveCugBG#Al#WplbE)nn5 zilUd)^iqqwRjjgzq6$7$h^Qi*Dz;O_?)NQJk*z9OWyj$}QROdkwa;BEtP`Q8HLGTt XvAQOh)}+#!W4Ms2!grfCi;({TP1Cn1 delta 1397 zcmX}s4=|Kz90%~{*+1_RinUlmIy>$9vr%g!x<=fbzj3EfNphEJinZygle9Owh^8)f zFqd{XS(fN>+jRcaWk~<1Bz670O1Xx~pAM%`-Ip`HGoShXp67jj@B7X(&%CeIbW%-^ zDIHvw5aQ^UnEVYPL_DFmBTj4&$T~kB5!i91@X0{Jz1(9Gnp9hFLRDXjv4l_(E2bn> z%pyNP7953qH~}Z23TmMaE>8Eb$Ys0o!Dd!Si&Okf^gUdyP?a8 zts-lk*<>%Yftw4P{0YXcY?29iPy#wQ19h$((gbh7Sjr*hQij+-Cp>^>@CpWC6s+AC zvJm`X6(oS8J458q3~lZzhTK8%2wuQP;4NZ^DJ+H{h=*!;4ql5HvJtMqJeeU0fq2=} z4o+PxvUR#<5#^^jHrXR%lLImi$$ ziZEMN+Pr{Vr>3EzI@<=r;$AI|8m|H!`U z?kASdQCfwknfDe5vyAkY5|T$0UAe!6Z+#swsOn#tE%!{nnOE1^p!L;_SazfYK0bSn z`)+t{`6dISoQ8&ZZaXeG1&sx$97nSYKWc{ZRO}-mtE)B!SKaS08Bdeke!6ALU6EN= z-o{Q|QAzUCuR=GwNqSFr2khxyp1xZ=vGeq|(#n|B!_Vcp ztF=2~qF&$9=(*lrqoz#QwKIM#n!_N^w`{=MMtf+5RrPx2c$-mqdr;E*oam&N+Zwe!nKDg!|I*b% zvfA5UI5&je|4v}C&o{Dg_ybEnCd}drLyOCw5?}mk^!BkCgS@bs-P!p!o6Zq^f&FS* zYax!GgR!9{;S)b*>LA*)f-DGSC9B_f+wo*ZnDgPQEqvxvh1%06ji;a$9kk-1y52`` zt)RN4R2N8fo2f2^>VBl<(%N#iz1+8vZSNpcwVqG9=S`#+ajMX*qv?hbr N6yrhqBP(JJ{sUZGt62a5 diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.dll index f4897b893667c8d711f187e5492490c79abab6b8..3152517278f0d506e303bd85a0540565abb6c305 100644 GIT binary patch delta 4725 zcmY+|30RbM9tZIM_dmnT00Yc0jA34oAacxm2!;xx30{z9rje~{y16U%h@`BmhC1RX zS)z%cKzQJd;%2TOx6(Yf z(!6w`@uTO9wiXq($Fia=ndnmtMEQ)r1~#HNoW~W9LKMo1^WnDVUI$bE4N|^1^I?5= z+xgZP2SN@#j$D&owPdsg{9_YE*pjIsiU#M$f0&k>B- z4JXI2-4U;Kk87h1z_oFC-s1sw=Pb%|`WakOxQS&Bz8|)`rLv>b9Wh&JX9aAdP;XC1 z2`PWTyRHoUMmm?W)HMWgbM#94zzWw;RFcjlZFCJsd$*q58@$am0+&fYX4JV}#<011 zb~wGk^$N1`bv31*ca1@%d!EXCwjr_EH6B?WUG^alTv<3s+7mOzH3_Yn3RqQNvyhEh z^Yvk36GDX?oYa)h{4>V5rr_{GeUzR3Itf!@Sfr|mRkrOa+RX%Q>Q zNEH5ou@w3wqzKbdNO~AGK$wA(xnp!liV8>%~ zmBy;Y>hvqvh-VKtJ$Pk_uC%^0h52YDCH9@CXxMvdR-`R^0Y+<5mu6xMFkX=|zlXuF zL|A}HTIgYqEG0q#E_#)|jgY14Flu9k@HWQlvh0alCoIGy(%Vn%Q1o}wo6&m}&3fGT zsiJbq4s<<+MOdrKt?b^=L**6y-zlDec$ zjw(YwsmF7>6um?GHg%(-B2v3FRpq4Uq#bc(SgXrzNl2Qba4Ush#`ZOpqlR=XHk_5? zBa*uN_wjGi#KB00%9&YEATBz-O@^2C$;vrv6W~hxz&SOgR=ZVKy=rf~&xC;d-YkM_mtghk9hg-3733#7CCt>P9e(4^nN)mW@&+TC4^@+Y#j znmlZ|k5jD17E+SEowyCPr1yN?PH{W-5laG@Z3hmJvJfWjL_I0p5+?4#Y0|QQDDj{8 znl#xah&8xInj73p+>Nm%>Lxtw8NNiQMHXqPp`Z8x){sW~rn|)t@fC4g;Bc`H=Sdd( zaB&YVkOGaF;$B=Med3!b{tGuqM*=g&kI+KOwr7g_&`L@T7$bfR<8pm58MX=Hegu&I z96VWcA3!@|ZOAn7AUczVITwnbKq6H;E5t)cC0W^I@i1N_y=<-#KgB5073(4K2*#6a zwnniYlSmzco5cpqBrS0~6py;Gofzk=5s%>mQeH@i^cfD4rn4C7I6_zGyQnrNOP?c* zG@hqQC(w<=1Jk81(2LX@JVH8&G}2wvMV~^3CjAaN1@}u7p7R+eox%jK@HBEL+hv*{ zoyJ11>8^Ic}TGJJL>@uVD%D-0@>&Z9;bFhH%`OIiM)6h((A z+nBse`WohP?fG{F|4V*}eS@HKbr}6&aRKc#>Fd6L&YC=|mtm!J0kNcT-<8t0NF#Mo z{{LLWAkycybZUcsVrujk)Y6h98Dq^mfn%c4Fio6tbYY#ZTf z!bwu>z!cVmM$(UIsxFh%2W}I-)1+^y2`zf2J^z}}sz`hOoj24 zgPpX~xIE~4v?aNG)=590E2)#;I_XEGlCmwe(ha;oS|5B$`U#n&8b_nlj8{ps{4Pm9 zBTJQAnb6@J6?YTW6vA>t`USO`^mX6DK~4HgaSIJpnZ--B0KC{2oX7GoDQ0MALRF;~RbtwQL(@dzGazzTYbYZ=lR;vu^qunN=a9DB3gync zf+VvFIf7S_^33bxNWP0?3aFC1@I9o);2m-l|8JFBpRmbsNRH+$6y6RwE5~r#7CpP{ zY?kAAUy`v+v+Ux7NEya@yTD)7q`%rC|I6=vrW7Xfxld#ZDQjoGBa3{+7XA6By$8y? zlEP&3@*tTXC$;!p3hKsNyoQPAt&|;AZoPP(u=S7oB7rAs@~{QY`*H%G<&|~k^C^q5 z&5^tFQbo%CJuETUuiLYHmlo=`P!GP(tFZ?^OpU*=w%vO0FGw9M_4b~;iS*ZidV4Q^ zixjWiGfDiuCjDfRxuIG=(KV*fuF1TMs@+qL#P&y0-70_F&bRffvu4d|iWszidFF}f z6}=|cRW8P=grJ^+#F)SGk%ufuLie6^&mV%-=&VTM2N{M87&N(y8@B2URbzbH>XR^yJ z+2xk}<)-mlc3v)6)fKq~yV4*Q0+GI{EnumIVLZ0*B}8I*VGb1gt3QHikFn~LGhZgv z+WG2q9}~+g+&aaXVfI<{9+=6TrM;eFy5>hvov#%yZ9z`Oke_y%1d+o-r!61J`?>tyS|ss%w>%SuX!SN7VH) zGat7UR%_bY-K97eX|v5^JA|Y5WGo@&jDF9Zf}cp|lk(lqqU&O#(mtltJpuWouM>8- zCm~QVvU}rpyHoKM=~_y?`$Y`RHnJnh$J~=KImb|I@&)%4;w07RFe)wPjP3WO;;YP9BL6}B6Eq+O-x)TVKxry%3%R1Q`~bFh?99=EC*0Yl_bJd0=tF__Rv(%>#xjY!V#?Z*2?+8oKMjALY zSJlw9T2`P>dnv~2(xzr+OOdKd9pA&?vqo5obUpO2N7f=C52w6Jm%)^;b)z*b6_z2@ zko7=pg|Hmyq-7oVs+vZ6BkChnnUC9jrfLOchx(qtN)%{P)YbdMYurF#@$fH&mDv8c z;Ww&oQ})WZz@X zJ1HUYR%AIklSU`r6w1+ybSCmvrHLQoBB?1jP5cL1NHgte zVguSpBZ8)g2XUK}VtY;e1P@3rht3j}LkL)B%(TuqUpx#4X`*Yn_$hjls$8XFBl?p9 z*(~u0hLK*h)QF#99O+76qu7L0lFimE9z{B-Tj+K17-o>xI39|}6>K8Lx@yD|*g?v2 zI;GE1O?sO}ODADnZ%nkxk|=!v8)+IJA)P`m5)V$6zC<+XdT6Tj72-&DQ6F_03A&6E zbQ;PC3eWpal};ngD?Eb?%Bsz;NoTOYEBhMRlu6E6;@7D0%Fd#Jvak*_rL(y0m7PO7 zWj+BTq;s$-#m1Vh*cVCPU?gd@bE$M5^K@x51#89{T~~0>ZDtp+o8(G%tJ+wi^>W2e z7`sZkfC@vvXsvP=WjSM$RMk945t#Nn))yM!Ggq(^n+zhTDo}UB;4H(PCuk@Mg8L zO_hHCyWmqNwc?&0df0rQM(HPDqqcev+h{fiQq&B+TBKPT}Hdxh|%R?t?H6)qrWc2D7}LrUZr<1hDtO1 zw>j=0gA^Qc-tk{d*JZT3i+Nt{?qVTTwpd>1eiubv*>5PLEY!R$_%|FhGDZI^?%^1P zqs?x14@Wj@tMIT1A$O&FxTnil#eHClk$rBjlkUT*%gEZ%m9lzYH)}`q6ImQ(^VJdB zv5_)GI|}Wnpzt&QW~m)@UJW0hfwFLOL&yVkEjNZw3fa;90sf@R82%w9Q`W9lKEwgi zKmCXGc!-;%X(0=GJVNiSOns>B6m@vUV|9Ai4D+5q#*2Or^{kAtkJPC#zSk=QKR}tq zY>~mwRA`-gSpSefRrg7U?UyCadv7zcWJjRv!-wh8rmdKniI1l+!r3gDxVT*_HP+v@`QC%3>`~$!0#lE3@#yl(qZ16=vZnI*kKm z;b~8lW>D$rpa|K*Gf9)wFCir+92_eL^Sz`Zdp|jZ?9D=AFZ!&dK*-=Hj4-FyePe(=W!gCB`Pg9T@G>a4ALh!YVW|aNqN>Ga!0Nx#O>LS6)v#uiiJi@k|0b{Y3S{X050ScAkJ_K%=ShDFI%*%puaf$!XC{GP(`D>TBELo17IUY*iM&IVI_=t=rkGI} zRKF(xw{mPvwcTINyZ?~{Q(Q>AATbu8{=Oj#k}x2?KD`lvCRdk< z<7*h6oygU0UQwTw>aQ`C#fzHI(buZ}2xBeY(1hN$Od%!vNH6=?s)-{zcN;QiTk**z zJl~J5R{nlf?Wkzd<>6(`1;}#$Ws3nJ5FMtZ#)y2RBu0p8u4L}^O0#E^`ova}E*@!amQlnfd-!&t(U zu?;gOj4@&!lkKrR48lZ~@idshtOnuvoZIyp)%*Yb{m=iLbInFS@|WYbFi{AP z{?oGG6GD`CdbTyIU|Mv=M>AsUNA3z)7q0qtPpL}MCwoX@G{z$X*_e&_Scs)qiI1@f zTd^Da5aB5a9paFL6pX`UOh+CHAY%ziu^Q#rg3ml9y*NN|1jlg}m+%Ab;69$f%1aVj zIH5h<(GC9She1fh2#iH0a_~O>g+=%PMy$nVY{TbXdP(f3s74J=<07u%6`Z>8fpEtp zOvfzD$097lDr~?O?7}`&;}|aDI_}^Be#3L9x=O+ZE%h|*;EwL-i7@m>9EM^X3Q>$w ztidL1Lk;esZ8u4DLK=#&0-LcNd(fu4BoeR*+wmoSg1(J6_ZjC<>ci#t@Rx)&9MA@C=<3h?&!ou3GHk?WIE>3^ zz$-Wea5XR#Q!pbyIY{M45_9RV#10(Ae{dOpAhstDCQ>mObFc`d*nllPx&ON;&Z7a3 zq3OkahYteL7x5^-W*o+GJcC1^Bsw4t!*Ld^f;bQi4(6b65$!^_V#r51j^Qlo185vV zxyQKmp#U?yLa4-P>RQ~y;|L4!7c`M?4%tH3M_P!E@InN1h(lVWgO`SdH>Xwb%l6 zlv>!LCEDVEr&_p?UEqr#L_mk>$U^~SEI}z&qa0gs68G^0Pw^^BuNIbl)WQyqXopVd z3O@uR644lpp%{hn$V34aU@5}-szrZfLDf$!T;T;@1S1MDNWe1e#UVY-DO|uy*z{** zL}4r@<3p6=AkM>Arxqz#iW+F5)xrU;@Iya5NACgDh{aHhMlSMU7+@)uK>u%=lQ@q& zPfKxSfR(rbw-}Ac#p0MZ_mLSth8G)K@g3^XfX8?W$AQeT@PIeckbxY`K_QA!iZ$3Y zkXhq6#W`HTP5cj!@E2aeY7kE@oZ$*D_#zllh(Q8IAQh95h1vKQ7GpWK;mDvjC!-`& z;~-{@9~t-=f1nZSSV`Ey2_4WGJ_tkvq7jc_7=wwJhCIx}LVSQStj8AY!ah{v7|!A{ zZY0s%!!P&~FJT$ibaYyCwlb%SIX%tUBTf=Qh%)t?wuy;TW)`D3I)am;m5D|z*JceNmCSn@$-r8m!{e|W}vkTYat-&$| z*T2=TG}RoKIrlOy$2Wa=i8)uAbE7%GHs|qprc85POI?o!bN_Ku>V^89rk%BTher~< z5N=+kGiR1LcbM}_a~?Eh)AlFW?mTKyj|M!(Q@n;IK@!aqn$~Si-O*I@bagQ=>}}4$ z=1exFvVmH>`&K<6K`o|YCJL|sOJT%1RA49e;t*zS7<;n0 zsm_mSLAHcORU*0wOJQf(h3((dI7=2HUKLCmWucRpOf7XPrS-5-3v0clP6^AqrdFp` z3oFYBrq;ufZyHMvE2eGBP%Dj?>3e{-!uM~DQqQqg>I0_ss;T|k)UIi!5pDbqXf@(+ z;F^{i@oq?)jvC=JU`{8Em=%AkueB&p-b-C_=ZL7#apR^{srtOIa?5J0x_z(xH&ws4 zIU@(Xbk1&u6HviFza%Qe3a zxj$^>(MP+7jLkji@vL3c$9W@)+P?nQ`un2AdBa~mxce|}^}TCJwfAF39rax9mF_ZN zXyBC8Ge!Bk=IRq}Rd%|XCQnyga&%i$>^I{#`Fz?VTR=)xy)i`K?_s{p|fyYeHw|^zp37 z+4Fi-UDCr-Z3iDZxqYL*r_H{NAL+fEM)sMoYN2#DZ_=k@R>Z7uHrVMme6r`=h*$Ic zJ@?lw`#SE9{ln!E<3D*VX^k^#f3W}YMaTh9T}pEN?=M4_H1BsIFZ6jU&#e)SpMKG< zdiYOsNB8%^y}tGN^41MSGjG<62t2d9BK>viCpmQmt0w1tbF)5e)3l@yBkx>wIX8Mw zewa<>e09ZdA}HfP$hrlcgD>1)@cfu#${&+;qd%H-;>wCyw>y^|iC&#waQe@>oL4up zXKyTT^sl>lq{Fq4CrQ_~tz5jj)ispPbc4RB7Yv+}Z@yv}al!Y*=XAS>)>Y zp|+*SR$04=40V2LiV&`bwZ^)lRB5L%yx2$DZ_Fs}DV;N}D-M!=G+rpyh5xSAvct}X zXIg7jVWUboq;eQmQsE<6r46ufRSRWmh?ecN%{dC|_F|AKzwoPZLbR71jfqPRN=ZhW zlJMAUURoi1<=jAJwka%;-`8qlg-DX~!<@%+5b}Jjjp(Mbw&Q&AwIZDB!epg3xbw;j z5pFPcRWe;3U|e3(jhmp{yrw&Fk2_>MQIev$Zd!8E=(Ti=%|9zteX#VdM&A&kY(7eM z^;NQ&?3bpbR`x4U(oyc)OUWd;pK07#?jNW0vt^yXl38+efOVdb3UA8E?#hB-dAKQU z<&mZv9V@4p`mS#7uaFHgRfBD~$-|M1`w3H`!D%nY%=*58OEN7bb zU@K4YP?isn-%nDqgJJRrC2b6cla(i=yWzq>r5|Lt9HsOJ%9ie?E4f6@Fn{#eVAF>3 X*mPxLchq)PBA~e&VVqvpp4tEZ+bOM% delta 4290 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 delta 499 zcmVRyRrC{JznQq`E#k>Nq{AYq-L!a%L$| zM5Xr4v{=St&k28wv;U@w4X1OydvRgv!H>mGxp1S+5H; zdi=@~0YeK<>>M-%PLcw5dz$vN^X3GR_U4l%T-ATc`Pij7J;{lKh0U0h{N>@adZ5mc zQI>F7q@OV*@{JoW{uET#Klj$+2Mpu2YUCy>JzIHFG!cK5&FcA=#gx#o%_U00jP*c{ zFwy^jhB313bq4wV4em)1wiMFTA0uJ6DKRZazoTR#55Hx&VLv#6!DVZ)ai!_jmYQ-< ziX9q)P9m(c(>rdKyWOy(EyZ-`_Od#!UcIi)mvi2SPNJXcitb;)<+u+~+HB_4y+u#u zbk*JN;LA=~kF1W4LfRgoQ00oWsCaPu21%?E$B)siUcjnX9nwWzTh=}|l@VY6O1hqR pczV#c^UtL`{rk<^%&vt`k(Jic(oIC`DJU3+DODxz2eak|LLHoS`epzC diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.Quic.Native.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.Quic.Native.dll index 1948251dea8c1782bc9b0327973172b5b0d8791f..6bfffb8a23dfefef212ce0d8a7458922dd1e13a0 100644 GIT binary patch delta 183 zcmZpuX{edd!BXMv)wQw5K$6jV@?J?*M(fRwC4UMD>~*oKQOFa5FNn8R{A6nObh1Ysk#R(kvbGa`F=600EEZ5hlGBRZiP`+*UpKRW)fc zi%F^iR8Z(UR1l(3Lb{kQpz z&LS3m3q1n{25v?MHbXrFJyVO#a}Al9SYBTcT{C%!ae%(tx>7@XYPyF zC$pHODnJDz-$Dg}s&zajTGWTH<(p;Ws;jiQ(}b0Y(~5zCff0zUHcvN`W@5D1yxC$k cBcsLScq?;O3kE#~gUy0AX^fj0ZT>R?0HxYSg8%>k diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.Quic.Native.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.Quic.Native.pdb index e825a4ea4d86eb91fd8846eefd547b8bc17e883e..847cefd2ec07da79be7a0eefeecc9cc27aecda8b 100644 GIT binary patch delta 709 zcmV;$0y_P;UASG4d=yCMSTv0|dP291MylZYdXj@1TIsg2ui$`97HvSKRbDD#abv zEd@fQ{{gKB;ik16$j=|JAVXME)UiK4#m!|BosND_>V?<)6&@F#(D;#HpCk(&K!-&x z4`5xMvKkHd26&y6Ey?g8p?C>JYqr+&vTWGezH&Zw@ zyPiW0Uxkh4siteerlV-!1FE_l_X`05f>d^8a&xn<37rBMyG)U)06+o&IkyaGeCH%c zzLi(bcbhtHlVl7d80ZS>@c;k;0I%eSRs~9zPO!p=!D6w+IFp|Y7etosTIB$M001O# zVml#G@Ii)YJQ5H19sx&TZDm7sY;-P7WpijQWNd5z00B=ghs*%L3ILR`gh`g|1W1c> r+9^JrnVXaP3>p~6DsG7YU$NObM6eUur(IHM65$IW}-Ns8M&Z|LSgO z704T>c#);wP?fqW4Cj9e+|~2lJaub~!e4k8-D{lH6mEsQT zmI9&D|A5wmaMRijewHj;^s1mPDj5d^}_4@3Xh9VX#7a9&@VlEnD@aJ zq%8BdH2_!n?G?z5!2_q*-5!H%*`F8k!NYi{G=bm%=>pu-}U z2e2+rS&fE!1H4YkmSlL4P`reqHCyX>SvG8KUpb$;@^|%RethI=OgQd@o8A4Cx5wh{ zUC*J0ufj(2RMWL!(@`|=0aaa&`vn03f>d^8a&xn<37rBMOrNIT06+o&#g6{`T zt#*l(&cL<+lVl7d7;h)0fdBvj05|O9RyHhtN~0fh$%P!p~k6fO1uUb`G<%EDeky98Ofc diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.dll index 3880dc313ce8364ff1ee70e2946ec7c80280755a..b02d835548ea7de9770ded14fb8c5cb1538d528f 100644 GIT binary patch delta 256 zcmZozpxLlMb3zA;zkd6f#-7$5#?~ID)*j~89+uV~*47@jtv&24Zj9E`C%Um4%UUxa z!0a6eHY1Q}J^i5@yELP9`(HQq?SI`k(!U8z+1TPa?JbK(ckwMvySX!GFE6p>yvc8= zXTZR~&B(xJsAr&OYPr2xj4M})fiuG3&c?h^IIl6aAPEYQy=^?IM zz6wxLu_sVbkotskDWXnU7jzgIB<^iL=*o4Li4){PuxqwY_uvv{Vzk`8+KVfhksVdstd~SX+D8w)U{IxG`EypXkPJENjJp z0JC=>*o;7?)%1sM?9z-@?SI|axBqqHNdG2KEPf>G>BeiWvt}*#OFjBLcX^2|=S_YK zJp%>?Zbk++Lp=jMQ;Y4*VqCd;EEaxMU#EX@;R+CVKd+5T_rGymv#O%HM9 z@>PI}9#(~lg4AC%v5H#dcCmi@{-(g~2VJ?&GI4@j2zJf(=^k9dOpF%WS9@_KGcsCC b=l9_aLCY5C@lfsnP30qk3U$tofvAYEf4 z0Q$A2c;rE&Aq&cbn8K)4g!7knvBy{pfy+S!006C2O=}cE5WNTXKNNFH(9Fbx2RA{8 zD+z)NlEn2O9%_1OW=i^F=&Cl%Px5d0%cLjkvWp5MZXX7w`_+4|KB%fXKk8YWR25ud z(s169r-(|;>*+F|hn@w0OlSxmQD6svdISUw!Il}igRgq@9SLXv&5Akt2Jl7y@351x-*n#D;H_8r`hqU0_Q zf6F^+Eg9wDFEjKrijb@AxcnVZUT@!4!42rgYt_hgQaUXhDVm6X%BDE`GMmM>+@%~9 z{2tdGSwf+IAsWWWU9Wp2Kfc476k$VNrv8}VpB_V$`P6SoOyuFv;c2l-R@Wr`5*n86 zbpw&mDmwy4(nEuaH407Y!YOA=^9gj;m9O16M!i<3Mqg~AZSS28Na*=(CP zY-vML4h#9ByeMCPzA7)~r~A&gA-c&Y+P@Lbr~42?lgxfww&`k_t2dwMfz{Ig(`=4V zqC8c(wFd(`1Yr$v{1|QV9Ex6bkY!bMtbM9W6I}Jnag{&sxt;{49dNt9kMg!y-@i$0 z8~7AiX%!l}iP$;v3dW*Hnd5!}0U`k)0UrSz0UH4s0T%(ccwPa?0vNkYk*WYd0suL; z3}}4kBuKuMSI&2vI&PPtfB_tTE@W(M0005#3hMCy00986DlOmAmrX>MmOWNd5z00EZnTIB$M001O#Vml#G@Ii)YJQ5H19sx&TZDm7s zY;-P8WpsCMa%*XBXD(!HYybcO$0}}#0AL6JT=;~k+nBRSyF|Nl$A-rP$zBnfxqDI8J)?fsnP30qk3Ur$9+is=c1b zC|wV(d_g?z$rQa<>fLbH5BzmD-uuaKfy+S!006C2+iDa+5Pc8qKNRznpqYsef^32i zR}uslB#G;T_)ybRGgH!+p{v?3pX6`&Wzv&%*+qpBw;u+k`_wt7E>u;WAN4FwstT?! zX*lo5Q$(fa^>mrfL(c+#CNu<(D6j)SJpzJ;V9N~M!B;){js!G-=E#;Ufx{6DCLv&N zLX2b-YU=SDhY08!cw}p#Ca^&ixZSa7Pfyw`5NRhqNy1h22hYbY&Eg~p`ws3$QF51u zzvUgZmW*=nml^sQMab25T>cIyueWcj;0E;LwQA%#DV-LM6iq~bWmBAena$!`?oy5l zevj*pETPc95DjDGuGc-1AKzh3im)LsQ-4hGPmdwWeCoF(Ch~CT@U&PZt80>e2@T8k zx`9Y&l^ua2>7hZz8igixVVCTbXf`6`B?+`4!Yw*lC0oF=#YrBQLScyED;bsIY_`oC zwzQ!rhlPAmUX(9?UzHd0(|zaL5Z&Yx?cWIJ(|w4cNoKz-+jODlOmAmrX>MmOWNd5z00B%@ox~y z2(yY>>KQOFa5FNn8R{A6nOZV1C^It1O+F|uJlVm3d-F8icZ@8R>$s;*?$8eqaD1@Z z`xxJKkLgigPX#S~oih1_e!c=!P~tjN5TtsI+qA-usR}LJM}4MlE;kTo;&?@RxS1F&H!n6h&&X&wx!BB{)sjJv!CcFB^CJv?nLw+Z~W8jv?_dl#QPml_cjM; z2(yY>=ov6Da5FNn8R{A6nOZO~C^It1O+F|uJlVm3d-F8icZ@8YM|~bm?$8eqFx3p! zPd4K9>HqTBu*X#5|Ku0?`3g|Mp7T&akm{9Y4MH=lZtdMXd&|ttV^3=jV`~pnYY+3*9u}q_j8@b8f3U;?skc8^^nsM@PZn`T zt9H|$EZa?gvc9etF#NsL$NYGV-wx|VtGgI?9P=M8xX4OA)fx06F006C&&uZI15XSF;yu;vA3$c_QdT0^~ zsY^nk2_;V5L+N3(8c9Re zRVi+ZK>Hu-&dsCy~&Xw$wvLzWmi=Umq ztTXHNtSno$Zm0^ELixMzGEX15nhdAE{CfMv$?w6<^4-9`hA+ZKi&WEhhJIFG7D zuKNXt4>tj~4>tn(i5R;~k*WYd0suL;3}}4kBuKuMSI&2vI&POC!2%;k=nCrb00031 zujGeT1xlAru)>JJVzI?IM`3McLv?I)E=+G{XK8L{E@W(M0004&?poylfB*m_aAG?l dQSd>AX*?1S_#Oe5jZgy`ho!*+x23@YO9bOxHP-+D delta 643 zcmV-}0(|}Oix2RN50HEmZLW?UyL5I-oY;De2&6uxDc9f5fsnP30i!g3P^!9wMo7`T z=sdOv$YD?}Q|DXaM0r{#f?|j7b6y$Tfx06F006C&-D=xF5QXmpd56JQEyPlKQ7B0$ zq%H}CCX_gJFG?>)tC2Kxf5glvMvv6j=#!OIQe*cA9PnN&X!p!_hO?_J%lSda@ljdA z1rCF*Uq)xd1qr=7E?Uw8emgEMZ z6X>|@<~>Q1Bw%y|fmE^0F*iw|#Xwpr$pbyd{E9uTNOafyRdHIpep8(8&-oCizVaIS z{{i>MeUelUZaeH>YYdb#DQ?NuNxpMz_s89{c{&tqb%40?y{XY~=SucT*^-Q(#m`P) z)|vHsR+cSWH&lg7q5R!tj~4>tn(i5N_urr!WS0szLd9$kX(2TrYaiIvX4wg8tQ!2%;kZzraK00031 zH|*qAHY|QhqaSn0g&f_(M`3McLv?I)E=+G{XK8L{E@W(M0003@RpiS6fB*obFWV#G d`a4F2x3r06{@P-fjZgy`ho!*+x23@YO9X7zHzNQ5 diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/gamecult_mesh_quic_native.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/gamecult_mesh_quic_native.dll index 06a43172c0ed5d51c555db088f6fab78e29a79dc..48ff569f01a5dad922b96109f1e30b054bef7436 100644 GIT binary patch delta 5068 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 Date: Tue, 15 Sep 2026 20:02:33 +0200 Subject: [PATCH 19/94] Add the TypeScript QUIC realtime plane migration target Eureka target for giving cultmesh-ts a QUIC realtime provider and consumer, byte-compatible with GameCult.Mesh.Quic and the Unity native MsQuic connector. First consumer: the StreamPixels service publishing to its Unity overlay. Operator rulings 2026-09-16: overlay character, subathon window and scene intents travel as QUIC state frames and the costume catalog as an HTTPS content artifact; shared TypeScript route verification moves to a browser-safe module; Windows x64 and Linux x64 only; datagrams out of scope. Co-Authored-By: Claude Opus 5 --- docs/typescript-quic-realtime-target.md | 160 ++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 docs/typescript-quic-realtime-target.md diff --git a/docs/typescript-quic-realtime-target.md b/docs/typescript-quic-realtime-target.md new file mode 100644 index 00000000..751d5277 --- /dev/null +++ b/docs/typescript-quic-realtime-target.md @@ -0,0 +1,160 @@ +# TypeScript QUIC Realtime Plane Target + +Date: 2026-09-16 + +Status: target accepted by the operator (2026-09-16), ready for Eureka. No cut +map exists yet. When the pipeline starts, Imagination maps the cut into +`docs/typescript-quic-realtime-cut.md` against `main` at `a0813c6` or later. + +The TypeScript runtime gains the CultMesh QUIC realtime state plane that the C# +runtime already has: a provider that serves frames and a consumer that receives +them, byte-compatible with `GameCult.Mesh.Quic` and the native MsQuic connector +the Unity package ships. This document states the end state and the invariants +that constrain getting there. + +Operator ruling, 2026-09-16, on providing QUIC for a Node service: "Option 2 all +the way, this is what CultLib is supposed to be, we're not half assing it." A +separate .NET provider process and a WebSocket shortcut were both rejected. + +## Why now + +The first consumer is StreamPixels. Its service (Node 24, TypeScript, on +Yggdrasil) must publish realtime state to a Unity overlay running on a +streamer's machine. The overlay is a receive-only client using the Unity +package's `CultMeshNativeQuicRealtimeTransportConnector`. Today no TypeScript +path exists: + +- Node v24.15.0 has no `node:quic`, with or without `--experimental-quic`. +- `packages/cultmesh-ts` and `packages/cultnet-ts` contain no QUIC code. +- `GameCult.Mesh.Quic` (.NET 10, `System.Net.Quic`) is the only QUIC provider. +- The C# TCP control and content connectors are plaintext and restricted to + loopback (`src/GameCult.Mesh/docs/transport-planes.md`, "Security and release + gate"), so they cannot carry the overlay's remote session either. + +## This touches the foundation + +- **Wire parity is an invariant.** The C# codec is the reference: + `src/GameCult.Mesh/CultMeshRealtimeWireProtocol.cs`. The TypeScript runtime + must produce and accept identical bytes: + - ALPN `cultmesh-state-v1`; connection close code `0x43554c54`, stream abort + code `0x53544154`; reliable stream type `1`, latest-only stream type `2`. + - Frame: magic `0x31545343`, then a 37-byte little-endian fixed header + (delivery byte, producer epoch i64, sequence i64, channel/schema/body id + lengths u16, payload length i32, header size i32 = 37, wire version u16 = + 1), then UTF-8 channel id, schema id, body id, then payload. + - Limits: payload at most 64 MiB; each identity at most 65,535 UTF-8 bytes; + decode rejects wrong magic, unknown version, out-of-range delivery, and any + length that does not sum exactly. +- **Delivery semantics are an invariant** + (`src/GameCult.Mesh.Quic/README.md`, `CultMeshRealtimeTransports.cs`): + - `ReliableOrdered`: one persistent ordered stream; broadcast is + completion-bearing. + - `LatestOnly`: independent streams; at most one pending frame per + `(channel, body)`, replaced by a newer `(producer epoch, sequence)` + generation; a keyed coalescing outbox per physical peer, so a slow or + departed consumer never backpressures the producer. + - `Unreliable`: fails closed until datagrams are exposed, matching the managed + C# adapter. +- **Trust is an invariant.** No remote session comes online without the chain + in `transport-planes.md`: an Odin-signed `CultMeshRouteCertificate` (Verse, + authority runtime, protocol set, endpoint, generation, validity, provider + P-256 key) checked against consumer-pinned Odin roots, TLS 1.3, and the + endpoint certificate bound to that route, including the + `cultmesh-state+quic://host:port?cert-sha256=` pin. + Signatures are ECDSA P-256 over SHA-256 with P1363 `r || s` encoding and the + length-prefixed canonical transcript. Unsigned traffic exists only under an + explicit `LocalDevelopment` policy on loopback. +- **One implementation of TypeScript route verification.** `cultmesh-browser` + already verifies Odin route certificates and provider nonce possession with + WebCrypto (`packages/cultmesh-browser/src/index.ts`, `verifyAuthorityRoute`, + `canonicalRoute`, `canonicalSession`, `verifyP256`). The Node QUIC path must + reuse that owner, not grow a second verifier. +- **The realtime plane carries state frames only.** Schemas, commands, + receipts, manifests, and immutable content do not travel through it + (`ICultMeshRealtimeTransport` doc comment). RUDP is never installed + implicitly in its place. +- **Existing consumers survive.** The StreamPixels service already imports + `cultcache-ts`, `cultnet-ts`, and `cultmesh-ts` (`verse-state.ts`, + `idunn-rudp-health.ts`) for Odin advertisement and Idunn health over RUDP. + Imagination audits every other TypeScript consumer across `F:\Projects` + before sizing the cut. + +## Target state + +- `cultmesh-ts` exposes a QUIC realtime provider and a QUIC realtime consumer + with the same ergonomic shape as the C# `CultMeshQuicRealtimeServer` + (listen, broadcast with an explicit delivery mode) and + `ICultMeshRealtimeTransportConnector` (connect by advertised candidate, + receive frames), under the branded `CultMesh` entrypoint. +- QUIC comes from native MsQuic bindings owned by CultLib, not from a Node + polyfill or a third-party QUIC stack with different semantics. How the binding + is built and shipped is the means (Imagination probes it); what it must + deliver is TLS 1.3, ALPN, independent unidirectional or bidirectional streams, + certificate validation with a caller hook, and clean close and abort codes. +- Frame encoding and decoding exist once in TypeScript and are tested against + bytes produced by the C# codec. +- Application code never picks endpoints, ranks routes, or writes reconnect + loops; `CultMeshSessionManager`-equivalent route selection owns that, as in C#. +- The build produces binaries for the hosts that run them: Windows x64 for + local development, and Linux x64 for Yggdrasil, built on Linux or the deploy + path's builder, not cross-compiled on Starfire. + +## Not in this migration + +One foundation per pipeline. These are separate, named pipelines or consumer +work: + +- **TypeScript content plane** (a provider in `cultmesh-ts`, a verifying HTTPS + reader in `cultmesh-browser`) for exported character artifacts. HTTPS content + transport and single-host trust on Yggdrasil were already ruled. +- **Authenticated remote control plane** (TLS on the TCP schema and content + connectors). See Q1. +- **Browser QUIC** (WebTransport). Browsers keep the verified WebSocket path. +- **Python, Rust, and Kotlin QUIC.** The parity scope is role-scoped; this + migration claims TypeScript and C# only. +- **StreamPixels integration** (service publication, overlay subscription, and + the catalog and scene-intent schemas) is consumer work in StreamPixels after a + released `cultmesh-ts` exists. + +## Verification the cut must reach + +- Golden frame bytes from the C# codec decode in TypeScript, and TypeScript + encodings decode in C#, for every delivery mode and at the length limits. + Malformed inputs are rejected identically. +- Separate processes, both directions: a TypeScript provider to the C# native + connector (the one Unity uses) and to the managed connector, and a C# managed + provider to the TypeScript consumer. Extend the existing parity harnesses + (`CULTMESH_NATIVE_EXTERNAL_ENDPOINT`, `packages/cultnet-ts/test/interop`) rather + than adding a parallel one. +- `LatestOnly` coalescing: a stalled consumer does not delay the producer, and + the consumer converges on the terminal generation. +- Trust negatives: an expired or unsigned route, the wrong Odin root, a + mismatched `cert-sha256` pin, and a replayed nonce are each refused, with a + mutation per rule. +- The Linux x64 binary runs on the Yggdrasil deploy path, verified on that host. + +## Rulings (operator, 2026-09-16) + +The operator accepted every recommendation below ("You got it"). Each question +is kept with its options as the record of what was decided against. + +- **Q1. Which remote plane carries the overlay's non-frame data?** The realtime + plane forbids schemas, commands, and content, and the TCP planes are + loopback-only. A: publish her character, the subathon window, and scene + intents as QUIC state frames with their CultCache schema id and payload, and + ship the costume catalog as a versioned immutable artifact on the HTTPS + content plane; the overlay sends no commands, so it needs no remote control + plane. B: add TLS to the TCP schema and content connectors as its own + pipeline first. **Recommended: A.** It needs no new plane for M1, matches a + receive-only client, and leaves TLS TCP to the first consumer that sends + commands. +- **Q2. Where does shared TypeScript route verification live?** It is inside + `cultmesh-browser` today, and `cultmesh-ts` is Node-only. A: move it to a + browser-safe shared module that both import (for example beside + `cultnet-ts/contracts`). B: have `cultmesh-ts` depend on `cultmesh-browser`. + **Recommended: A**, so neither transport package owns the other's trust. +- **Q3. Which platforms must the native binding support at release?** + **Recommended: Windows x64 and Linux x64 only**, the two hosts that run it + today. +- **Q4. Are QUIC datagrams (`Unreliable`) in scope?** **Recommended: no.** Fail + closed like the managed C# adapter; no consumer needs them. From bf9f6f7874c8b3e37c141bb1f538856dba7cb4c2 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 13:16:56 +0200 Subject: [PATCH 20/94] Map the TypeScript QUIC realtime plane migration Seven cuts against main at f2cd2eb4, with the largest liability priced first rather than discovered later. The native binding was the open question: a probe loaded the committed msquic.dll through koffi under Node 24, drove a handshake on MsQuic's own threads and closed cleanly, with no addon build and no toolchain at load time. It is one cut, not the campaign. The consumer audit found no package at zero external consumers and every external consumer on a file: path rather than the registry, which is why registry naming is an operator question rather than an assumption. Two corrections against the target are recorded in the map rather than absorbed silently: a cited transport filename that does not exist under that name, and a registry path the target assumes for cultmesh-ts that has never existed. Co-Authored-By: Claude Opus 5 --- docs/typescript-quic-realtime-cut.md | 1065 ++++++++++++++++++++++++++ 1 file changed, 1065 insertions(+) create mode 100644 docs/typescript-quic-realtime-cut.md diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md new file mode 100644 index 00000000..d2416191 --- /dev/null +++ b/docs/typescript-quic-realtime-cut.md @@ -0,0 +1,1065 @@ +# TypeScript QUIC Realtime Plane Cut Map + +Date: 2026-09-16 + +Status: Imagination output for the target in +`docs/typescript-quic-realtime-target.md` (operator-accepted 2026-09-16). No +code in this document has been written. Nothing here is committed by +Imagination; the root agent commits. + +Anchor: repo `F:\Projects\CultLib`, branch `main`, HEAD +`f2cd2eb4641269c653977bdba9b4bce2a26d870c`. Every `file:line` below is read +against that commit. If HEAD moves, re-anchor before cutting. + +How to read this document: section 1 prices the largest liability first, as +the target requires, because if that price had turned out to dominate the +campaign, the cut order below would have been wrong. Section 2 is the probe +ledger; every mechanism claim in this map carries `(probe)` when it was +established by running something, or `(source read)` when it was established +by reading a file at a named line. Nothing is claimed from a package name or a +README. Section 3 is the consumer audit. Section 4 names rejected options and +why. Section 5 is the authority map for every ownership change. Sections 6-12 +are the cuts. Section 13 holds the operator questions; section 14 the +subtraction estimate; section 15 what could not be assigned. + +Two corrections to the target, recorded here rather than silently absorbed: + +- The target cites `src/GameCult.Mesh.Quic/CultMeshRealtimeTransports.cs`. + That file is `src/GameCult.Mesh.Quic/CultMeshQuicRealtimeTransport.cs` + (674 lines). `CultMeshRealtimeTransports.cs` exists, but in + `src/GameCult.Mesh/`, and holds the transport-neutral contracts + (`CultMeshRealtimeDelivery` at :8-13, `CultMeshRealtimeFrame` at :19-44, + `ICultMeshRealtimeTransport` at :46-52, + `ICultMeshRealtimeTransportConnector` at :55-63) `(source read)`. +- The target says the binding is "shipped through a registry". Today only + `@gamecult/cultcache-ts` has a registry publish job + (`.github/workflows/publish-packages.yml:20-24`, `:40-76`); `cultnet-ts`, + `cultmesh-ts` and `cultmesh-browser` have none, and every external consumer + reaches them by `file:` path (section 3). Registry delivery of the binding + therefore also means registry delivery of `cultnet-ts` and `cultmesh-ts`, + which is a naming decision the operator has not yet made. See Q5. + +## 1. The largest liability, priced first + +The target's biggest new surface is CultLib owning native MsQuic bindings for +Node on two platforms. The price depends on three things: what Node itself +offers, what the repo already owns, and how a native artifact reaches a +consumer host without a toolchain. Each was probed. + +### 1.1 What Node offers + +- Node `v24.15.0` on Starfire has no `node:quic`, with or without + `--experimental-quic` (`ERR_UNKNOWN_BUILTIN_MODULE`), and its internal + binding table has no `quic` entry (`No such binding: quic` under + `--expose-internals`). `process.versions` reports `openssl 3.5.5`, no + `ngtcp2`, no `nghttp3`, `napi 10` `(probe)`. Yggdrasil runs Node `24.14.1` + from NodeSource (`F:\Projects\gamecult-ops\inventory.md:660`) `(source read)`, + so the same absence holds on the deploy host. +- Conclusion: there is no first-party QUIC in this Node line. Anything that + works is native. + +### 1.2 What the repo already owns + +- `native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp` (440 lines) is a + CultLib-owned C ABI over MsQuic: `cultmesh_quic_open/state/poll/error/close` + (`:309-440`). It negotiates ALPN `cultmesh-state-v1` (`:32`, `:341-344`), + uses deferred certificate validation and answers the pin decision through + `ConnectionCertificateValidationComplete` (`:239-263`), reassembles the + 1-byte-kind plus 4-byte-LE-length QUIC stream framing (`:123-157`), and + queues whole encoded frames for a polling host (`:400-418`). It is Windows + desktop only by construction: ``, ``, `` + (`:1-3`), `CryptHashCertificate2` for the pin (`:184-200`), + `__declspec` exports (`:18-22`), and the CMake build refuses non-Windows + (`CMakeLists.txt:4-6`) `(source read)`. +- The bridge is consumed by the Unity connector through `DllImport` of library + name `gamecult_mesh_quic_native` + (`src/GameCult.Mesh.Quic.Native/CultMeshNativeQuicRealtimeTransport.cs:259-277`), + which polls every 2 ms by default (`:14`, `:167-203`) `(source read)`. The + built DLL and `msquic.dll` 2.5.9 are committed at + `unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/` (last rebuilt in + `a0813c6`, 2026-09-14) `(probe: git log)`. +- The Windows build is scripted and pinned: `scripts/build-quic-native.ps1` + downloads `Microsoft.Native.Quic.MsQuic.Schannel` `2.5.9` by URL, checks its + SHA-256 (`:13-14`, `:27-41`), and builds with CMake `-A x64` (`:48-52`). + The last build on this machine used Visual Studio 17 2022 Build Tools, MSVC + 14.44 (`artifacts/quic-native-build/x64/Release/CMakeCache.txt`) `(probe)`. + `cl.exe` is not on PATH but Build Tools are installed, so the existing + script works here as-is. +- `tests/GameCult.Mesh.Quic.Native.Tests/GameCult.Mesh.Quic.Native.Tests.csproj:20-29` + builds that bridge before the test build and copies it beside the test + output `(source read)`. `scripts/build-unity-package.ps1:80-82`, `:143-147` + builds it again for the Unity package `(source read)`. + +Conclusion: CultLib already owns the MsQuic body for one platform, one role +(client), and one host (Unity). The cost of the target is extending that body +to a second role (provider), a second platform (Linux x64), and a second host +(Node), not creating a body from nothing. + +### 1.3 How Node loads it + +The decisive probe: from Node 24.15.0, with `koffi@3.3.0` installed into the +scratchpad, `koffi.load` loaded the committed `msquic.dll` then +`gamecult_mesh_quic_native.dll`, bound the five v1 exports by C prototype, +called `cultmesh_quic_open("127.0.0.1", 9, <64 zero hex>)` which returned `0` +with a non-null handle, observed `cultmesh_quic_state` move from `Connecting` +to `Failed` after 34 ms, read the bridge's structured error string through +`cultmesh_quic_error` ("shut down by the transport (status=0xFFFFFFFF800704D0, +error=0x1, msquic=F:\...\msquic.dll, events=event=1)"), got `-2` from +`cultmesh_quic_poll` on a failed client, and closed cleanly `(probe: +scratchpad/koffi-probe/probe.js)`. MsQuic ran its worker threads inside the +Node process and the poll model crossed the boundary without any callback +into JS. + +What that proves and what it does not: + +- Proves: the existing CultLib C ABI is directly loadable and drivable from + the Node line in question with no addon build, no Node headers, no MSVC at + install time, and no per-Node-version artifact. The `.async` call form + exists on bound functions (`typeof state.async === "function"`), which is + the mechanism for a blocking wait off the JS thread `(probe)`. +- Does not prove: a QUIC handshake succeeded (port 9 was intentionally dead); + that the provider role works (the bridge has none); that Linux works (the + bridge is Windows-only). Those are cut deliverables, not probe results. + +koffi facts used by the design, from its shipped documentation, not from +memory: JS callbacks always run on the main thread and calls from other +threads are queued to it, with an explicit deadlock warning if the main thread +blocks on a secondary thread (`node_modules/koffi/doc/callbacks.md:166-176`); +asynchronous calls run on a worker pool sized to the core count with a default +cap of 256 queued calls (`doc/misc.md:26`, `:37`); prebuilt binaries ship for +Windows x64 and Linux/glibc x64 among others, Node >= 16, no compiler needed +(`doc/index.md:17-38`) `(source read)`. Package weight: 1,713,562 bytes +unpacked, 87 files, MIT `(probe: npm view)`. The design below uses no JS +callbacks at all; the only crossing is one blocking `next_event` wait per +runtime issued through `.async`, so the deadlock class in `callbacks.md:176` +cannot occur. + +### 1.4 How it reaches Linux + +- `libmsquic` is published by Microsoft for Debian 13 (trixie) at + `packages.microsoft.com/debian/13/prod`, versions including `2.5.9` + (`pool/main/libm/libmsquic/libmsquic_2.5.9_amd64.deb`, 2,906,420 bytes, + SHA-256 `1baa61ade0b7b4a99f6dcb6b00d9aedb12b5566d00918a325be7425e878e51ba`, + `Depends: libssl3t64, libnuma1, libxdp1, libnl-route-3-200`) `(probe)`. + Yggdrasil is Debian 13 (`gamecult-ops/inventory.md:356`) `(source read)`. + The same `2.5.9` pinned for Windows exists for the deploy host. +- The NuGet packages carry Windows binaries only: `Microsoft.Native.Quic.MsQuic.OpenSSL` + 2.5.9 contains `bin/{x64,x86,arm64}/msquic.dll`, `lib/*/msquic.lib`, + and headers `msquic.h`, `msquicp.h`, `msquic_winuser.h`; no `.so`, no + `msquic_posix.h` `(probe: nupkg listing)`. The Linux build needs + `msquic.h`, `msquic_posix.h`, `quic_sal_stub.h` from the msquic source + tree at tag `v2.5.9`; all three are fetchable at + `raw.githubusercontent.com/microsoft/msquic/v2.5.9/src/inc/` (HTTP 200, + 79,280 / 17,909 / 4,731 bytes) `(probe)`. GitHub releases `v2.5.9` carry only + `*_test.zip` bundles; `v2.5.11`, `v2.6.1` carry no assets `(probe)`, so the + deb is the only distribution-grade Linux runtime for this version. +- Build host for Linux: Docker Desktop on Starfire runs a `linux/amd64` engine + `(probe: docker version)`, so a `debian:13` container is a Linux build host + for the development loop. The release artifact must come from a Linux host + the deploy path trusts: Yggdrasil itself, or a CI runner. Q6. +- Windows toolchain: MSVC Build Tools 2022 present; CMake 4.3.2; also a MinGW + gcc from StrawberryPerl on PATH `(probe)`. The map keeps MSVC for Windows + because the committed Unity DLL is built with MSVC `/Brepro` for + reproducibility (`CMakeLists.txt:17-19`) `(source read)`; mixing toolchains + for one DLL is a liability with no capability behind it. + +### 1.5 Price verdict + +The binding does not dominate the campaign. The C body exists; the Node load +path is proven with one 1.7 MB MIT dependency and zero addon tooling; the +Linux runtime is a pinned distro package on the exact target OS; the Windows +build is already scripted. The real cost is the C++ rewrite from a +client-only, Windows-only, per-client poll bridge to a runtime-neutral, +two-role event bridge (section 8), estimated at roughly 1,000 lines of C++ +replacing 440, plus a Linux build script and CI job. That is one cut, not the +campaign. + +What would have changed this verdict: if the bridge had needed JS callbacks +from MsQuic worker threads (it does not; the wait/event model avoids them), or +if `libmsquic` had not been available for Debian 13 at the pinned version (it +is), or if the FFI load had failed on Node 24 (it did not). + +## 2. Probe ledger + +| # | Claim | Method | Evidence | +| --- | --- | --- | --- | +| P1 | Node 24.15.0 has no `node:quic` and no internal quic binding | probe | `require('node:quic')` -> `ERR_UNKNOWN_BUILTIN_MODULE` with and without `--experimental-quic`; `--expose-internals` -> `No such binding: quic`; `process.versions.ngtcp2 === undefined` | +| P2 | The committed CultLib MsQuic bridge loads and runs from Node 24 via koffi | probe | `scratchpad/koffi-probe/probe.js`: open rc 0, state 2 after 34 ms, structured error string, poll -2, clean close | +| P3 | koffi ships Windows x64 and Linux glibc x64 prebuilds, needs no compiler, Node >= 16 | source read | `koffi/doc/index.md:17-38` | +| P4 | koffi async calls run on a worker pool; JS callbacks only on the main thread | source read | `koffi/doc/misc.md:26,37`; `koffi/doc/callbacks.md:166-176` | +| P5 | koffi is 1.7 MB unpacked, MIT | probe | `npm view koffi dist.unpackedSize dist.fileCount`; `package.json:27` | +| P6 | MSVC Build Tools 2022 (14.44) and CMake 4.3.2 are present; the last bridge build used them | probe | `artifacts/quic-native-build/x64/Release/CMakeCache.txt`; `cmake --version` | +| P7 | `libmsquic 2.5.9` exists for Debian 13 amd64 with its SHA-256 and dependency set | probe | `packages.microsoft.com/debian/13/prod/dists/trixie/main/binary-amd64/Packages` | +| P8 | Yggdrasil is Debian 13 with Node 24.14.1 from NodeSource | source read | `gamecult-ops/inventory.md:356`, `:660` | +| P9 | MsQuic NuGet OpenSSL 2.5.9 carries no Linux binary or posix header | probe | nupkg listing | +| P10 | MsQuic POSIX headers are fetchable at tag v2.5.9 | probe | HTTP 200 for `msquic.h`, `msquic_posix.h`, `quic_sal_stub.h`, `msquic_winuser.h` | +| P11 | The pinned `msquic.h` has `QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12`, deferred/indicated certificate flags, `QUIC_SEND_FLAG_FIN`, `QUIC_STREAM_EVENT_SEND_COMPLETE`, API version 2 | source read | `artifacts/dependencies/msquic-schannel-2.5.9/package/build/native/include/msquic.h:123,132-133,142,246,394-398,1290,1530,1850` | +| P12 | Docker Desktop on Starfire runs a linux/amd64 engine | probe | `docker version --format '{{.Server.Os}}/{{.Server.Arch}}'` -> `linux/amd64` | +| P13 | `openssl` 3.5.5 CLI is available on Starfire (mingw) | probe | `which openssl` | +| P14 | npm names `cultmesh-ts`, `cultnet-ts`, `cultmesh-browser`, `@gamecult/cultmesh-ts`, `@gamecult/cultnet-ts`, `@gamecult/cultmesh-quic-native` are all unclaimed | probe | `npm view version` returned nothing for each | +| P15 | Only `@gamecult/cultcache-ts` and the three Python packages have publish jobs | source read | `.github/workflows/publish-packages.yml:20-24,40-76` | +| P16 | Every external TS consumer uses `file:` paths; none uses a registry version | probe (Explore agent over `F:\Projects`) | section 3 | +| P17 | The StreamPixels deploy path extracts a CultLib tarball beside the app and runs `pnpm install --frozen-lockfile` and `pnpm build` on Yggdrasil | source read | `gamecult-ops/scripts/deploy-streampixels-preview.sh:21,95-103` | +| P18 | The Unity native connector refuses any endpoint without a 64-hex `cert-sha256` pin | source read | `CultMeshNativeQuicRealtimeTransport.cs:103-105` | +| P19 | C# `IsProtected` accepts `wss`, `https`, or any scheme containing `quic`; the browser verifier accepts only `wss` | source read | `CultMeshAuthorityProof.cs:156-162`; `cultmesh-browser/src/index.ts:965` | +| P20 | C# and browser canonical route transcripts are field-for-field identical | source read | `CultMeshAuthorityProof.cs:275-292` vs `cultmesh-browser/src/index.ts:979-996` | + +## 3. Consumer audit + +Method: every `package.json` under `F:\Projects` (excluding `node_modules`, +`dist`, `dist-test`, `.git`, `bin`, `obj`, `Library`, `Temp`, and CultLib +itself and its worktree copies) checked for the four package names, plus a +grep of every `*.ts/*.tsx/*.mts/*.cts/*.js/*.mjs/*.cjs` import or require of +them, with symbols read from the import lines. Vendored copies inside +`Heimdall/vendor/CultLib`, `VoidBot/vendor/cultcache-ts`, and +`gamecult-ops/.artifacts/*` were classified as library-internal, not +consumers. + +Result: + +| Package | Repos | Source files | Symbols actually imported (union) | +| --- | ---: | ---: | --- | +| `cultnet-ts` | 11 (StreamPixels, Heimdall, AetheriaEve, AetheriaEve-cultlib-admission, VoidBot, Stonks, Vili, weksa, Sai, EvePlugins, Bifrost) | 28 | `CultNetRudpSession`, `decodeRudpPacket`, `encodeRudpPacket`, `encodeCultNetMessageForWire`, `parseCultNetMessage`, `invokeCultNetOperation`, `startCultNetOperationServer`, `defineCultNetDocumentBinding`, `CultNetDocumentRegistry`, runtime-presence helpers, and message/packet types | +| `cultnet-ts/contracts` | 0 | 0 | one esbuild alias only (`AetheriaEve-cultlib-admission/scripts/verify-aetheria-browser-provider.mjs:48`); `cultmesh-browser` is its only importer and is inside CultLib | +| `cultmesh-ts` | 7 (StreamPixels, Heimdall, AetheriaEve and its worktree, Stonks, weksa, Odin and its worktree) | 10 | `CultMesh`, `cultMeshRectFromBounds`, `cultMeshViewportRequest`, and types (`CultMeshRudpEndpoint`, `CultMeshDocumentCatalog`, `CultMeshViewportRequest`, diagnostics types) | +| `@gamecult/cultcache-ts` | 1 (Heimdall) | 5 | `SingleFileMessagePackBackingStore`, `defineDocumentType`, `CultCacheEnvelope` | +| `cultcache-ts` (old unscoped name) | 8 | 16 | `CultCache`, `SingleFileMessagePackBackingStore`, `defineDocumentRegistry`, `defineDocumentType`, `/inspection` | +| `cultmesh-browser` | 1 (AetheriaEve and its worktree) | 1 | `CultMeshBrowserClient`, `CultMeshBrowserOdinRendezvous`, `decodeCultNetPayload` | + +StreamPixels specifically: `apps/service/package.json:25-27` declares +`cultcache-ts`, `cultmesh-ts`, `cultnet-ts` as `file:../../../CultLib/packages/`; +`apps/service/src/verse-state.ts:4-6` imports `defineDocumentType`, +`CultMesh`, `defineCultNetDocumentBinding`; `apps/service/src/idunn-rudp-health.ts:2-7` +imports `encodeCultNetMessageForWire`, `encodeRudpPacket`, and two types. +Nothing else in StreamPixels imports these packages. No TS/JS file anywhere +under `F:\Projects` references `cultmesh-state+quic` or `CultMeshRealtime`. + +Sizing consequences: + +- Nothing this migration adds has a consumer yet. The QUIC surface is new + API; no existing export is reshaped, so no external repo changes are + required by the CultLib cuts. StreamPixels adoption is consumer work after + release (target, "Not in this migration"). +- The `verifyAuthorityRoute` family in `cultmesh-browser` is module-private + (not exported at `cultmesh-browser/src/index.ts:955`, `:979`, `:998`, + `:1012`, `:1028`), so moving it (Q2) changes no external import. The three + symbols AetheriaEve imports stay. +- `cultnet-ts/contracts` has no external consumer; adding a sibling subpath + export for the shared verifier follows an existing, internally consumed + pattern rather than inventing a new one. +- The `cultcache-ts` naming split (8 repos on the old unscoped name, Heimdall + on `@gamecult/`) is pre-existing and not touched here, but it is the + precedent Q5 has to reckon with. + +## 4. Rejected options + +- **Node built-in QUIC.** Absent in Node 24 (P1). Not a choice. +- **`@matrixai/quic` 2.0.9.** A Rust/quiche-based QUIC stack with its own + stream, certificate and event semantics `(probe: npm view description)`. + Rejected because the target requires the bytes on the wire, the ALPN, the + stream-kind byte, the deferred certificate pin decision, and the close/abort + codes to match `GameCult.Mesh.Quic` and the Unity MsQuic connector; two QUIC + stacks would have to be proven equivalent at every one of those points, and + CultLib would own neither. Semantically wrong for this campaign, not merely + unfashionable. +- **`@fails-components/webtransport` 1.6.8.** libquiche behind a WebTransport + (HTTP/3) session model `(probe)`. Wrong layer: the realtime plane is raw + QUIC with ALPN `cultmesh-state-v1`, not HTTP/3. +- **`node-quic` 0.1.3.** A wrapper around an abandoned pure-JS QUIC `(probe)`. + Not TLS 1.3 MsQuic; rejected on the same grounds. +- **A Node-API addon (node-addon-api + node-gyp/cmake-js) wrapping MsQuic + directly.** Viable, but it creates a second C++ owner of MsQuic callback + semantics beside the Unity bridge, requires Node headers and MSVC on every + Windows build host and a Node-ABI artifact per platform, and buys nothing the + C ABI plus FFI does not (P2). Rejected as duplicate authority. If koffi were + ever removed, the cheapest replacement is a thin N-API shim over the same C + ABI, not a second MsQuic body. +- **A separate .NET provider process or a WebSocket shortcut.** Already ruled + out by the operator (target, line 15-17). +- **JS callbacks from MsQuic worker threads.** koffi supports them by queuing + to the main thread (P4), but it turns every MsQuic event into a + cross-thread hop and opens the documented deadlock class. Rejected in favour + of the event-queue/wait model the existing bridge already uses. +- **Building the Windows DLL with the MinGW gcc on PATH.** Present (P6) but the + committed Unity artifact is MSVC `/Brepro`; two toolchains for one DLL is a + reproducibility liability. Rejected. +- **Building the Linux artifact on Starfire and shipping it.** Cross-building + is explicitly forbidden by the target; a Docker `debian:13` container on + Starfire is a Linux host and is fine for the development loop, but the + release artifact comes from the builder the operator names in Q6. +- **Keeping `cert-sha256` verification in C.** The v2 ABI hands the DER + certificate to the host and waits for the decision, which is the "caller + hook" the target demands and removes the Windows-only + `CryptHashCertificate2` from the portable path. The v1 entrypoint keeps its + in-C pin check only as the Unity compatibility shim (section 8). + +## 5. Authority maps + +### 5.1 Native MsQuic bridge (`native/GameCult.Mesh.Quic.Native`) + +- Owner: `cultmesh_quic_native.cpp` owns MsQuic registration, configuration, + listener, connection and stream handles, TLS credential loading, the + 1-byte-kind + 4-byte-LE-length stream framing, and a single event queue per + runtime. +- Inputs: host/port, PKCS12 bytes and password for providers, the host's + certificate decision for clients, encoded frame bytes to send. +- Outputs: events (`listener_new_connection`, `connection_connected`, + `connection_certificate_received` with DER payload, `connection_shutdown` + with code/status/text, `stream_started` with kind, `stream_frame` with the + whole encoded frame, `stream_send_complete`, `stream_shutdown`); the bound + listener port; structured error text. +- Derived state: none that the host reads as truth. Connection counts, remote + addresses and MsQuic status codes are diagnostics. +- Forbidden writers: the bridge never decodes a CultMesh frame, never decides + delivery semantics, never coalesces, never accepts a certificate on its own + in the v2 path, never reconnects. The v1 shim is the only place a pin is + compared in C, for the Unity contract only. +- Shared paths: the Unity managed connector (v1 exports) and the Node binding + (v2 exports) use the same library, the same MsQuic runtime, the same + framing code. +- Deletion line: the per-client `Client` struct with its own registration + (`:51-63`, `:316-393`), Windows-only includes and export macros (`:1-3`, + `:18-22`), `CertificateMatchesPin` as the sole trust path (`:184-200`). + +### 5.2 TypeScript QUIC realtime plane (`packages/cultmesh-ts`) + +- Owner: `src/realtime-quic.ts` owns provider and consumer semantics: which + stream kind carries which delivery mode, the per-peer keyed coalescing + outbox for `LatestOnly`, the single ordered stream for `ReliableOrdered`, + `Unreliable` failing closed, the generation filter on receive, and the + certificate pin decision on the consumer. +- Inputs: bridge events; `CultMeshRealtimeFrame` objects from application + code; an advertised `CultMeshTransportCandidate`-shaped route from the + session manager; the consumer's trust policy. +- Outputs: encoded frames to the bridge; decoded frames to the application; + the advertised endpoint string for a provider (with `cert-sha256`). +- Derived state: connection health, connected peer count, stream ids. +- Forbidden writers: application code never opens a stream, picks an + endpoint, or writes a reconnect loop (target). `src/realtime-wire.ts` never + touches a socket. `src/realtime-quic-native.ts` (the koffi binding) never + interprets frame bytes. +- Shared paths: provider broadcast and consumer send both go through + `sendFrame` on the same transport object; the coalescing outbox is the only + path for `LatestOnly` on a provider, whether the caller is a test, a tick, or + a reconnect. +- Deletion line: none inside `cultmesh-ts` (there is no prior QUIC code); the + RUDP provider transport at `src/provider-rudp-transport.ts` is untouched. + +### 5.3 Shared TypeScript route verification (Q2) + +- Owner after the cut: `packages/cultnet-ts/src/cultmesh-authority.ts`, + published as subpath `cultnet-ts/authority`. It is the only TypeScript + implementation of: Odin root lookup, validity window, canonical route + transcript, canonical session transcript, P-256/P1363 verification, + loopback detection, and the protected-scheme rule. +- Inputs: a route view (Verse, authority runtime, endpoint, protocol ids, + priority, generation, certificate), a trust policy (`mode`, `odinRoots`, + `now`), a session-open request and an accepted message. +- Outputs: resolution or a thrown `Error` with the same message texts the + browser package emits today (its tests pin them). +- Derived state: none. +- Forbidden writers: `cultmesh-browser` must not retain or regrow + `verifyAuthorityRoute`, `canonicalRoute`, `canonicalSession`, + `canonicalFields`, `verifyP256`, or `isLoopbackEndpoint`; `cultmesh-ts` must + not implement any of them; neither transport package may depend on the + other. Negative greps in section 6 pin this. +- Shared paths: the browser WebSocket client and the Node QUIC consumer verify + the same route bytes through the same function. +- Deletion line: `cultmesh-browser/src/index.ts:955-1072` and `:797-808`. +- Behavioural note, not a silent change: the protected-scheme rule becomes the + C# rule (`wss`, `https`, scheme containing `quic`; + `CultMeshAuthorityProof.cs:156-162`) instead of `wss`-only + (`cultmesh-browser/src/index.ts:965`). The browser client still refuses + non-`ws(s)` route endpoints at `:537-540`, so browser behaviour is + unchanged; the shared module simply stops being wrong for QUIC routes. + +### 5.4 Build and packaging + +- Owner: `scripts/build-quic-native.ps1` (Windows x64) and the new + `scripts/build-quic-native.sh` (Linux x64) own producing the bridge + artifact; `.github/workflows/publish-packages.yml` owns turning artifacts + into registry packages. +- Inputs: pinned MsQuic 2.5.9 (Schannel NuGet on Windows; `libmsquic` deb on + Linux) with SHA-256 checks; the bridge source. +- Outputs: `gamecult_mesh_quic_native.dll` + `msquic.dll` (win32-x64), + `libgamecult_mesh_quic_native.so` + `libmsquic.so.2` (linux-x64), each with + the MsQuic license. +- Derived state: `artifacts/` (git-ignored, `.gitignore:66`). +- Forbidden writers: no `postinstall` compile step in any published package; + a consumer host never needs CMake or a compiler. +- Deletion line: none; the Windows script is kept and the Unity package script + keeps calling it. + +## 6. Cut 1 (subtraction): one TypeScript route verifier + +Purpose: land Q2 before any QUIC code exists, so the Node consumer has one +owner to call and the browser package has nothing left to grow. + +Deletes (exact): + +- `packages/cultmesh-browser/src/index.ts:955-977` `verifyAuthorityRoute` + (23 lines), `:979-996` `canonicalRoute` (18), `:998-1010` `canonicalSession` + (13), `:1012-1026` `canonicalFields` (15), `:1028-1058` `verifyP256` (31), + `:1065-1072` `isLoopbackEndpoint` (8), `:797-803` `bytesToBase64` (7), + `:805-808` `base64ToBytes` (4). Total 119 lines deleted from the browser + package. `randomNonce` (`:1060-1063`) stays: it is browser-client behaviour, + not verification. + +Keeps and moves: + +- The deleted bodies move verbatim into + `packages/cultnet-ts/src/cultmesh-authority.ts` as exported functions, with + one edit: the protected-scheme test in `verifyAuthorityRoute` becomes + `isProtectedEndpoint(endpoint)` implementing the C# rule (P19). Types + `CultMeshBrowserIdentity`, `CultMeshBrowserRoute`, + `CultMeshBrowserP256PublicKey`, `CultMeshBrowserRouteCertificate`, + `CultMeshBrowserAuthorityTrustMode`, `CultMeshBrowserAuthorityTrustPolicy` + (`cultmesh-browser/src/index.ts:19-53`) move too, renamed without the + `Browser` infix (`CultMeshAuthorityIdentity`, `CultMeshAuthorityRouteView`, + `CultMeshP256PublicKey`, `CultMeshAuthorityRouteCertificate`, + `CultMeshAuthorityTrustMode`, `CultMeshAuthorityTrustPolicy`). + `cultmesh-browser` re-exports them under the old names as type aliases. +- `validateSessionAcceptance` (`:926-953`) stays in the browser package; it + compares WebSocket handshake fields. Its crypto lines (`:944-951`) are + replaced by a call to the new `verifyProviderSessionProof(request, endpoint, + providerKey, signature)` exported from the shared module. + +Adds: + +- `packages/cultnet-ts/src/cultmesh-authority.ts` (about 190 lines: the moved + 119 plus types and `isProtectedEndpoint`). Browser-safe by construction: it + may use only `globalThis.crypto.subtle`, `TextEncoder`, `atob`, `btoa`, + `URL`, `DataView`, `Uint8Array`. No `node:` import. +- `packages/cultnet-ts/package.json:7-18` gains an `"./authority"` export + beside `"./contracts"` (`:12-16`), same three-key shape. +- `packages/cultnet-ts/src/index.ts` re-exports the module's public names. +- `packages/cultnet-ts/test/cultmesh-authority.test.ts` (about 150 lines): + signs a route with `node:crypto` `generateKeyPairSync("ec", { namedCurve: + "P-256" })` and verifies through the shared module; one negative per rule + (expired, unsigned remote, wrong Odin root, mutated endpoint, wrong signature + length); and asserts `isProtectedEndpoint` accepts `wss://`, `https://`, + `cultmesh-state+quic://` and rejects `ws://`, `cultnet+tcp://`. +- A cross-runtime vector: `tests/GameCult.Mesh.Tests/CultMeshAuthorityProofTests.cs` + gains a test that calls `CultMeshAuthorityProof.CreateSignedRoute` + (`src/GameCult.Mesh/CultMeshAuthorityProof.cs:221`) with a fixed test key + and writes `contracts/cultmesh/authority-route-vectors.json` (route fields, + Odin public key, signature) when `CULTMESH_WRITE_VECTORS=1`, and otherwise + asserts the committed file still verifies. The TS test verifies the same + file through the shared module. This is a shared-vector check, not + cross-process interop; it proves the transcript bytes, which is what Q2 + needs. + +Per-file changes: + +- `packages/cultmesh-browser/src/index.ts:1-17` add + `import { verifyAuthorityRoute, verifyProviderSessionProof, isLoopbackEndpoint, type ... } from "cultnet-ts/authority";` + (the package already imports `cultnet-ts/contracts` at `:2-17`, so + resolution is proven). `:536` and `:914` call the imported function + unchanged. `:944-951` call `verifyProviderSessionProof`. `:961` and `:965` + are gone with the function. +- `packages/cultmesh-browser/tsconfig.json` unchanged (`moduleResolution: + "Bundler"` already resolves the `exports` map). + +Verification: + +- `npm run test --workspace packages/cultnet-ts` (build + unit; pins the + shared verifier and the vector file). +- `npm run test --workspace packages/cultmesh-browser` (all 17 existing tests + at `test/cultmesh-browser.test.ts:29-472` must pass unchanged; they pin the + error strings and the refusal order, including "rejects a mutated or expired + signed route before opening a provider socket" at `:239-258`). +- `dotnet test tests/GameCult.Mesh.Tests --filter FullyQualifiedName~AuthorityProof` + (vector generation/verification; focused, one project). +- `node scripts/test-typescript-package-closure.mjs` (the packed + `cultmesh-browser` tarball must resolve `cultnet-ts/authority` from the + registry-shaped install at `scripts/test-typescript-package-closure.mjs:63-72`). +- Negative greps (must return nothing): + `rg -n "crypto\.subtle\.(verify|importKey)|function (verifyAuthorityRoute|canonicalRoute|canonicalSession|canonicalFields|verifyP256|isLoopbackEndpoint)" packages/cultmesh-browser/src packages/cultmesh-ts/src` + and `rg -n "cultmesh-browser" packages/cultmesh-ts/package.json packages/cultnet-ts/package.json`. +- Operator-only: none. + +## 7. Cut 2 (behaviour, pure TypeScript): the realtime frame codec + +Purpose: byte parity with `CultMeshRealtimeWireProtocol` before any transport +exists, proven in both directions with shared vectors. + +Deletes: none. + +Adds: + +- `packages/cultmesh-ts/src/realtime-wire.ts` (about 130 lines). Exports + `CULTMESH_REALTIME_ALPN = "cultmesh-state-v1"`, + `CULTMESH_REALTIME_CONNECTION_CLOSE_CODE = 0x43554c54n`, + `CULTMESH_REALTIME_STREAM_ABORT_CODE = 0x53544154n`, + `CULTMESH_REALTIME_RELIABLE_STREAM = 1`, `CULTMESH_REALTIME_LATEST_ONLY_STREAM = 2`, + `CULTMESH_REALTIME_MAX_PAYLOAD_BYTES = 64 * 1024 * 1024`, + `CULTMESH_REALTIME_MAX_ENCODED_FRAME_BYTES` (= max payload + 37 + 3 * 65535, + matching `CultMeshRealtimeWireProtocol.cs:20`), type + `CultMeshRealtimeDelivery = "reliable-ordered" | "latest-only" | "unreliable"` + with wire bytes 0/1/2 in that order (`CultMeshRealtimeTransports.cs:8-13`), + interface `CultMeshRealtimeFrame { channelId; schemaId; bodyId; + producerEpoch: bigint; sequence: bigint; delivery; payload: Uint8Array }`, + `encodeRealtimeFrame(frame): Uint8Array`, `decodeRealtimeFrame(bytes): + CultMeshRealtimeFrame`. Layout exactly `CultMeshRealtimeWireProtocol.cs:37-54` + (magic `0x31545343` LE u32, delivery u8, epoch i64 LE, sequence i64 LE, + three u16 LE lengths, payload i32 LE, header size i32 LE = 37, version u16 + LE = 1, then UTF-8 identities, then payload). Decode rejections match + `:60-76` one for one: truncated header, wrong magic, unsupported version or + header size, delivery out of range, negative payload length, length sum + mismatch. Epoch and sequence are `bigint` because i64 exceeds the safe + integer range; validation mirrors `CultMeshRealtimeTransports.cs:29-39` + (non-empty identities, non-negative epoch/sequence). +- `contracts/cultmesh/realtime-frame-vectors.json`: written by a new C# test + `tests/GameCult.Mesh.Tests/CultMeshRealtimeWireProtocolTests.cs` under + `CULTMESH_WRITE_VECTORS=1` and otherwise asserted against. Cases: one frame + per delivery mode with small payload; empty payload; identities at exactly + 65,535 UTF-8 bytes (multi-byte characters included so byte length and + character length differ); epoch and sequence at `long.MaxValue`; and a + 64 MiB-payload case recorded as `{ sha256OfEncoding, encodedLength }` rather + than bytes. Malformed cases: wrong magic, version 2, header size 36, + delivery 3, payload length -1, length sum off by one, each with the C# + exception message. There is no existing C# test for this codec + (`rg CultMeshRealtimeWireProtocol tests` returns nothing `(probe)`), so this + is also the first direct C# codec test. +- `packages/cultmesh-ts/test/realtime-wire.test.ts` (about 120 lines): every + vector decodes to the recorded fields and re-encodes to the recorded bytes; + every malformed vector throws; the 64 MiB case is built in-process and its + SHA-256 compared; TypeScript-produced bytes for the same fields equal the + C#-produced bytes (this direction is what "TypeScript encodings decode in + C#" means when the vector file is the medium; the cross-process direction is + cut 5). +- `packages/cultmesh-ts/src/index.ts:37-40` gains `export * from "./realtime-wire";`. + +Verification: + +- `dotnet test tests/GameCult.Mesh.Tests --filter FullyQualifiedName~RealtimeWireProtocol`. +- `npm run test --workspace packages/cultmesh-ts`. +- Negative grep: `rg -n "0x31545343|cultmesh-state-v1" packages --glob '!**/dist*/**'` + must hit only `realtime-wire.ts` and its test in TypeScript (one codec). +- Operator-only: none. + +## 8. Cut 3 (native, subtraction then behaviour): the runtime-neutral bridge + +Purpose: one MsQuic body for Unity and Node, two roles, two platforms, no +callbacks across the host boundary. + +Deletes first (in `native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp`): + +- `:1-3` Windows includes; `:18-22` `__declspec` macros; `:51-63` per-client + `Client` with its own `api/registration/configuration`; `:184-200` + `CertificateMatchesPin` as the trust path; `:288-305` `CloseHandles`; + `:309-393` `cultmesh_quic_open` as the primary API. About 200 of 440 lines + are removed or rewritten; the framing consumer (`:123-157`), stream callback + (`:159-182`), trace/error helpers (`:65-86`, `:202-221`) are kept in spirit + and re-homed on the runtime. +- `CMakeLists.txt:4-6` (Windows-only fatal) and `:7-9` (`MSQUIC_ROOT` + mandatory) are replaced by a platform branch. + +Adds (C ABI v2, all `extern "C"`, exported with a portable macro +`CULTMESH_API` that is `__declspec(dllexport)` on MSVC and +`__attribute__((visibility("default")))` elsewhere): + +``` +int32_t cultmesh_quic_runtime_open(const char* app_name, void** out_runtime); +void cultmesh_quic_runtime_close(void* runtime); +int32_t cultmesh_quic_listener_open(void* runtime, const char* host, uint16_t port, + const uint8_t* pkcs12, int32_t pkcs12_len, const char* password, + uint64_t* out_listener_id, uint16_t* out_bound_port); +void cultmesh_quic_listener_close(void* runtime, uint64_t listener_id); +int32_t cultmesh_quic_connection_open(void* runtime, const char* host, uint16_t port, + uint64_t* out_connection_id); +int32_t cultmesh_quic_connection_certificate_complete(void* runtime, uint64_t connection_id, + int32_t accept); +void cultmesh_quic_connection_shutdown(void* runtime, uint64_t connection_id, uint64_t code); +int32_t cultmesh_quic_stream_open(void* runtime, uint64_t connection_id, uint8_t kind, + uint64_t* out_stream_id); +int32_t cultmesh_quic_stream_send_frame(void* runtime, uint64_t stream_id, + const uint8_t* encoded_frame, int32_t length, int32_t fin); +void cultmesh_quic_stream_shutdown(void* runtime, uint64_t stream_id, uint64_t code); +int32_t cultmesh_quic_next_event(void* runtime, int32_t timeout_ms, + cultmesh_quic_event* out_event, uint8_t* payload, int32_t payload_capacity, + int32_t* out_required); +int32_t cultmesh_quic_last_error(void* runtime, char* destination, int32_t capacity); +``` + +- `cultmesh_quic_event` is a fixed 64-byte struct: `uint32 type; uint32 + stream_kind; uint64 listener_id; uint64 connection_id; uint64 stream_id; + uint64 code; int32 status; int32 payload_length; uint8 reserved[16]`. + Types: 1 `listener_new_connection`, 2 `connection_connected`, 3 + `connection_certificate_received` (payload = DER), 4 `connection_shutdown` + (payload = UTF-8 reason), 5 `stream_started` (inbound, `stream_kind` set + from the first byte), 6 `stream_frame` (payload = one whole encoded frame, + length prefix stripped), 7 `stream_send_complete`, 8 `stream_shutdown`, 9 + `listener_stopped`. `next_event` returns 0 on timeout, 1 with the event + filled and payload copied, 2 when `payload_capacity` is too small (event + stays at the head; `out_required` set), negative on error. This is the v1 + two-phase poll convention (`:400-418`) applied to a queue of typed events. +- Client connections use `QUIC_CREDENTIAL_TYPE_NONE` with + `INDICATE_CERTIFICATE_RECEIVED | DEFER_CERTIFICATE_VALIDATION | + USE_PORTABLE_CERTIFICATES` (already at `:358-364`), return + `QUIC_STATUS_PENDING` from the certificate event, enqueue event 3, and call + `ConnectionCertificateValidationComplete` only when the host calls + `certificate_complete` (P11: `msquic.h:132-133,142,1290`). Timeout: the + bridge sets a 10 s handshake idle; if the host never answers, MsQuic's + handshake timeout closes the connection and event 4 is emitted. +- Listeners load `QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12` + (`msquic.h:123,394-398`), one credential type for Schannel and OpenSSL; the + provider's advertised pin is the SHA-256 of the DER certificate computed on + the TypeScript side from the same PKCS12 with `node:crypto` (no hashing in + C). +- Settings mirror the C# server/connector: `PeerUnidiStreamCount 1024` + (`CultMeshQuicRealtimeTransport.cs:77`, `:202`), idle timeout 30 s and + keep-alive 5 s as in the existing bridge (`:335-338`). +- `stream_send_frame` copies the bytes, prepends the 4-byte LE length, calls + `StreamSend` (with `QUIC_SEND_FLAG_FIN` when `fin`), and emits event 7 on + `QUIC_STREAM_EVENT_SEND_COMPLETE`. `stream_open` writes the kind byte as the + first send. Framing therefore lives in C on both directions, exactly where + the v1 bridge already keeps it (`:123-157`), and `CultMeshQuicRealtimeProtocol` + keeps it in C# (`CultMeshQuicRealtimeTransport.cs:635-655`). +- The v1 exports `cultmesh_quic_open/state/poll/error/close` are kept, Windows + only (`#ifdef _WIN32`), implemented on top of a private runtime with the pin + check retained from `:184-200`. External contract protected: the Unity + package `DllImport` at `CultMeshNativeQuicRealtimeTransport.cs:259-277` and + `CanConnect`'s Windows gate at `:39-41`. They delegate; they decide nothing + new. +- `CMakeLists.txt`: Windows branch unchanged in effect (MSVC, `/Brepro`, + `MSQUIC_ROOT` from the NuGet layout, links `msquic crypt32 bcrypt`); Linux + branch links `msquic` from `MSQUIC_LIB_DIR` (the extracted deb's + `usr/lib/x86_64-linux-gnu`) with headers from `MSQUIC_INCLUDE_DIR`, `-fvisibility=hidden`, + output `libgamecult_mesh_quic_native.so`, `RPATH $ORIGIN` so the sibling + `libmsquic.so.2` resolves. +- `scripts/build-quic-native.sh` (about 70 lines): fetches + `libmsquic_2.5.9_amd64.deb` from the packages.microsoft.com pool URL in P7, + verifies its SHA-256, extracts with `dpkg-deb -x`, fetches the three headers + at tag `v2.5.9` (P10) and verifies their SHA-256 (record the hashes at first + run into the script, the same way `build-quic-native.ps1:14` pins the + NuGet), configures CMake with Ninja, and copies `libgamecult_mesh_quic_native.so`, + `libmsquic.so.2`, and the MsQuic LICENSE into `artifacts/quic-native/linux-x64`. +- `native/GameCult.Mesh.Quic.Native/README.md` rewritten to describe both + roles, both platforms, the v1/v2 split, and the "no host callbacks" rule. + +Per-file changes outside `native/`: + +- `scripts/build-quic-native.ps1:54-58` output path becomes + `artifacts/quic-native/win32-x64` by default (parameter default at `:4`); + callers `build-unity-package.ps1:80-82` and the Native.Tests csproj `:20-22` + pass explicit `-OutputDirectory` today, so they are unaffected. +- No change to `src/GameCult.Mesh.Quic.Native/*.cs`. The Unity managed + connector keeps polling v1. + +Verification: + +- Windows: `powershell -File scripts/build-quic-native.ps1` then + `dotnet test tests/GameCult.Mesh.Quic.Native.Tests` (the csproj rebuilds the + bridge itself at `:20-22`; all four tests at + `CultMeshNativeQuicRealtimeTransportTests.cs:15-141` must pass, including the + wrong-pin refusal at `:79-99` and the departed-client test at `:101-141`). + This is the regression gate for the v1 shim. +- Windows FFI smoke, before any TypeScript transport exists: + `scratchpad`-style script (to be committed as + `packages/cultmesh-ts/test/realtime-quic-native.test.ts` in cut 4) that + opens a runtime, a listener with a PKCS12 generated by `openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 ... | openssl pkcs12 -export` + (P13), a client connection to it, answers event 3 with accept, sees event 2 + on both sides, opens a latest-only stream, sends one frame with `fin`, and + reads event 6 on the server side with the identical bytes. +- Linux, development loop: `docker run --rm -v F:\Projects\CultLib:/src debian:13 bash -lc "apt-get update && apt-get install -y cmake ninja-build g++ curl ca-certificates dpkg && /src/scripts/build-quic-native.sh"` + then the same FFI smoke under `node:24` in the container. This is a Linux + build on a Linux host; it is not the release artifact (Q6). +- Build economy: the only builds are the native CMake target and + `tests/GameCult.Mesh.Quic.Native.Tests` (which pulls `GameCult.Mesh.Quic`, + `GameCult.Mesh.Quic.Native`, `GameCult.Mesh`, `GameCult.Networking`, + `GameCult.Caching` by project reference). Before the first `dotnet build`, + take `Get-ChildItem -Recurse F:\Projects\CultLib\bin,F:\Projects\CultLib\obj,F:\Projects\CultLib\artifacts | Select FullName,Length` + to a scratch file and diff afterwards; restore or delete anything outside + those five projects' outputs. +- Negative greps: `rg -n "CryptHashCertificate2|wincrypt" native/` must hit + only inside the `#ifdef _WIN32` v1 block; `rg -n "windows.h" native/` only + inside `#ifdef _WIN32`. +- Operator-only: rebuilding and re-committing the Unity plugin DLL + (`unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/gamecult_mesh_quic_native.dll`) + and cutting a Unity package version through `scripts/build-unity-package.ps1` + is a release action; the map does not schedule it. Until it happens, Unity + keeps the old DLL, which is fine because v1 exports are unchanged. + +## 9. Cut 4 (behaviour): Node binding, consumer, session manager, trust + +Purpose: a TypeScript consumer that connects by advertised candidate, verifies +the Odin route through the cut-1 module, pins the TLS certificate, and +receives frames from the C# managed provider in a separate process. + +Deletes: none. + +Adds: + +- `packages/cultmesh-ts/src/realtime-quic-native.ts` (about 260 lines): the + koffi binding. Resolves the platform package (`@gamecult/cultmesh-quic-native-win32-x64` + or `-linux-x64`, Q5) or, when `CULTMESH_QUIC_NATIVE_DIR` is set, a directory + (this is how the repo's own tests point at `artifacts/quic-native/` + without a registry). Loads `msquic` first, then the bridge, by absolute path + (the probe showed the dependent library must be resolvable before the + bridge loads). Declares the twelve v2 prototypes. Exposes + `CultMeshQuicNativeRuntime` with a single event pump: a loop that awaits + `nextEvent.async(runtime, 250, ...)` and dispatches typed events to + registered listeners/connections by id. One pump per process-wide runtime; + reference-counted open/close. No koffi callbacks anywhere. +- `packages/cultmesh-ts/src/realtime-quic.ts` (about 650 lines across cuts 4 + and 5). Cut 4 lands: `CultMeshQuicRealtimeTransport` (implements + `sendFrame`, `receiveFrame`, `dispose`, `transportId = "msquic-realtime"`, + `endpoint`; the `isVerifiedFor(verseId, authorityRuntimeId, protocolId, + routeGeneration)` check mirroring `CultMeshQuicRealtimeTransport.cs:352-361`), + `CultMeshQuicRealtimeConnector` (`connectorId`, `priority`, `canConnect(candidate)`, + `connect(candidate, target, signal)`), and the receive path: stream kind + vs frame delivery consistency (`:519-524`), and the per-`(channel, body)` + generation filter that drops older `(producerEpoch, sequence)` (`:538-560`). + Certificate decision on event 3: caller `validateProviderCertificate(target, + der)` if supplied, else SHA-256 of DER equals the endpoint's `cert-sha256` + (`:111-119`, case-insensitive hex); otherwise reject. Endpoint parsing: + scheme `cultmesh-state+quic`, host, port, optional pin (`:98-109`). +- `CultMeshQuicRealtimeSessionManager` in the same file: takes an + `ICultMeshRealtimeLookupSource`-shaped port `{ resolve(target): Promise }`, + a trust policy from `cultnet-ts/authority`, and connectors. Binds + candidates from `authorityRoutes` whose `protocolIds` include + `cultmesh.realtime_state.v1` (`CultMeshSessions.cs:77`) and whose + `authorityRuntimeId` matches; verifies each with `verifyAuthorityRoute` + before any connector is asked; orders by connector priority then route + priority; races at most `maxRacedCandidates` per tier (`:833-880`); requires + `isVerifiedFor` after connect (`:885-896`); keys sessions by + `verseId + "\u001f" + authorityRuntimeId` (`:46`); marks offline on transport + failure. Ships with `CultMeshStaticRealtimeLookupSource` (an array of + `CultMeshVerseDescriptorMessage` from `cultnet-ts/contracts:350-369`). No + Odin WebSocket rendezvous in Node in this migration (Q7). +- `CultMesh` facade (`packages/cultmesh-ts/src/index.ts:4700`) gains statics + beside the RUDP ones at `:6008-6186`: `parseQuicRealtimeEndpoint`, + `createQuicRealtimeConnector(options)`, `createQuicRealtimeSessionManager(options)`, + and in cut 5 `createQuicRealtimeProvider(options)`. +- `packages/cultmesh-ts/package.json:44-48` gains `"koffi": "3.3.0"` (exact) + and `optionalDependencies` for the two platform packages (names per Q5). + `koffi` is required lazily inside `realtime-quic-native.ts` so consumers + that never touch QUIC (AetheriaEve Electron, Odin, Stonks, weksa) load + nothing native. +- `packages/cultmesh-ts/test/realtime-quic-native.test.ts` (about 150 lines): + the cut-3 FFI smoke, now against the runtime class. +- `packages/cultmesh-ts/test/realtime-quic-consumer.test.ts` (about 250 + lines): TypeScript consumer against a TypeScript listener opened through + the raw runtime (no provider semantics yet): connect with correct pin; + refuse wrong pin (`cert-sha256` of 64 zeros, mirroring + `CultMeshNativeQuicRealtimeTransportTests.cs:79-99`); refuse missing + certificate when no validator; caller validator observed with the target + identity; generation filter drops a late older generation (mirrors + `CultMeshQuicRealtimeTransportTests.cs:111-140`). +- Trust negatives, each a separate test with its own mutation, in the same + file, through the session manager with a static lookup source and a signed + route built with `node:crypto`: (a) expired certificate (`now` past + `expiresAt`); (b) unsigned remote route (certificate absent, mode + `authenticated-remote`); (c) wrong Odin root (trust has a different + `keyId`); (d) `cert-sha256` pin mismatch (route verifies, TLS pin fails, so + the connector rejects before `isVerifiedFor`); (e) replayed nonce. On the + QUIC plane there is no `session_open` nonce exchange; the route's + freshness is its generation plus the TLS handshake. The replay test + therefore mutates `generation` on the connected transport's target and + asserts `isVerifiedFor` fails and the session manager disposes the + transport (`CultMeshSessions.cs:885-896`). If the operator wants a nonce on + QUIC, that is a protocol addition on both runtimes and belongs to a later + pipeline; this map does not invent it. +- Interop lane, C# managed provider to TypeScript consumer, separate + processes: `tests/GameCult.Networking.InteropPeer/Program.cs:27-49` gains + mode `quic-realtime-serve` (`--port`, `--frames N`, `--delivery + latest-only|reliable-ordered`, `--interval-ms`): creates a self-signed + certificate exactly as `CultMeshQuicRealtimeTransportTests.cs:203-228`, + starts `CultMeshQuicRealtimeServer`, prints one JSON line + `{ endpoint: "cultmesh-state+quic://127.0.0.1:?cert-sha256=" }` + to stdout, then broadcasts `N` frames with increasing sequence and exits + after the last `send_complete` or on stdin close. + `GameCult.Networking.InteropPeer.csproj:9-11` gains a `ProjectReference` to + `src/GameCult.Mesh.Quic/GameCult.Mesh.Quic.csproj`. + `packages/cultnet-ts/test/interop/cultnet-interop.test.ts` gains + `test("CultMesh QUIC realtime: C# managed provider and TypeScript consumer", ...)` + using `spawnServeProcess` (`:2491`) for the C# peer and `runJsonCommand` + (`:2557`) for a new TypeScript peer script + `packages/cultmesh-ts/test/interop/cultmesh-quic-peer.ts` (`dial --endpoint + --expect N`) that prints the received frames as JSON (fields plus payload + hex). The harness drives processes; it does not import `cultmesh-ts` + (dependency direction: `cultmesh-ts` depends on `cultnet-ts`, so the reverse + import is forbidden). The peer script path follows the `tsPeerScript` + pattern at `:41`. + +Verification: + +- `npm run test --workspace packages/cultmesh-ts` with + `CULTMESH_QUIC_NATIVE_DIR=artifacts/quic-native/win32-x64`. +- `npm run test:interop --workspace packages/cultnet-ts` filtered with + `--test-name-pattern "QUIC realtime"`; it builds the C# interop peer through + the existing `csharpInteropPeerBuild` path (`:45-58`, `:71`). +- Negative greps: `rg -n "new Function|koffi\.register|\.async\(" packages/cultmesh-ts/src` + must show `.async(` only on `nextEvent` in `realtime-quic-native.ts` and no + `koffi.register` (no callbacks); + `rg -n "verifyP256|canonicalRoute" packages/cultmesh-ts/src` must return + nothing. +- Operator-only: none. + +## 10. Cut 5 (behaviour): TypeScript provider and the coalescing outbox + +Purpose: the StreamPixels role. A TypeScript listener that broadcasts with an +explicit delivery mode and cannot be backpressured by a slow consumer, proven +against both C# connectors in separate processes. + +Deletes: none. + +Adds (in `packages/cultmesh-ts/src/realtime-quic.ts`): + +- `CultMeshQuicRealtimeProvider.listen({ host, port, serverCertificate: + { pkcs12, password }, handshakeTimeoutMs })`: opens a listener, computes + `advertisedEndpoint` (`cultmesh-state+quic://:?cert-sha256=`, + uppercase, because the Unity connector requires the pin, P18), accepts + connections into a peer set, exposes `connectionCount`, `broadcast(frame)`, + `receive()` for client-originated frames, `dispose()`. +- Delivery semantics, mirroring `CultMeshQuicRealtimeTransport.cs`: + `reliable-ordered` opens one unidirectional stream of kind 1 per peer on + first use and serialises writes behind a per-peer promise chain; `broadcast` + resolves when every peer's `send_complete` arrives or the peer is evicted + (`:216-235`, `:237-255`). `latest-only` enqueues into a per-peer keyed + outbox (`Map<"channel\u001fbody", frame>` plus a ready queue) and returns + synchronously (`:363-367`, `:572-618`); each peer's pump opens a fresh kind-2 + stream per frame, sends with `fin`, and only dequeues the next frame after + `send_complete`, so a stalled peer accumulates at most one pending frame per + `(channel, body)` and never blocks `broadcast`. `unreliable` throws + `NotSupported` with the same sentence as `:373-375` adjusted for the + runtime. +- Peer eviction on send failure or `connection_shutdown`; no reconnect logic + on the provider. + +Interop lanes (all separate processes; all in +`packages/cultnet-ts/test/interop/cultnet-interop.test.ts`): + +- TypeScript provider to C# native connector (the Unity one): the harness + starts `cultmesh-quic-peer.ts serve --frames 5 --delivery latest-only`, + reads its advertised endpoint from stdout, then runs + `dotnet test tests/GameCult.Mesh.Quic.Native.Tests --filter FullyQualifiedName~NativeConnectorReceivesFromExternalManagedProvider` + with `CULTMESH_NATIVE_EXTERNAL_ENDPOINT=` (the existing test at + `CultMeshNativeQuicRealtimeTransportTests.cs:15-33` is reused unchanged: it + already asserts a frame arrives with non-empty schema, body and payload). + Rename the test to `NativeConnectorReceivesFromExternalProvider` since the + provider is no longer necessarily managed; the env var name stays. +- TypeScript provider to C# managed connector: add + `ManagedConnectorReceivesFromExternalProvider` to + `tests/GameCult.Mesh.Quic.Tests/CultMeshQuicRealtimeTransportTests.cs`, + gated by the same `CULTMESH_NATIVE_EXTERNAL_ENDPOINT`, using + `CultMeshQuicRealtimeTransportConnector` with the pin from the endpoint + (`:111-119`) and no validator, asserting frame fields and payload bytes + equal what the TypeScript peer prints. The harness runs it the same way. +- `LatestOnly` under a stalled consumer: `cultmesh-quic-peer.ts serve + --frames 200 --delivery latest-only --interval-ms 1` while the harness dials + twice with the TypeScript consumer, pauses one consumer's pump for 500 ms + (a test hook on the runtime that stops calling `next_event`), and asserts: + the provider's 200 `broadcast` calls complete within a bounded time + regardless of the pause; the healthy consumer reaches sequence 199; the + paused consumer, once resumed, converges on 199 with fewer than 200 frames + received. This is the TypeScript form of + `CultMeshNativeQuicRealtimeTransportTests.cs:101-141` plus the convergence + assertion from `CultMeshQuicRealtimeTransportTests.cs:111-140`. +- Golden bytes across processes: the C# managed connector lane above prints + the received frame's re-encoding (via `CultMeshRealtimeWireProtocol.EncodeFrame`) + as hex; the harness compares it with the TypeScript peer's `encodeRealtimeFrame` + output for the same frame. That closes "TypeScript encodings decode in C#" + by process, not by shared file. + +Verification: + +- `npm run test --workspace packages/cultmesh-ts` (provider unit tests with + the TypeScript consumer in-process but separate connections: reliable + ordering in both directions mirrors `CultMeshQuicRealtimeTransportTests.cs:71-110`; + latest-only coalescing; unreliable fails closed). +- `npm run test:interop --workspace packages/cultnet-ts --test-name-pattern "QUIC realtime"`. +- `dotnet test tests/GameCult.Mesh.Quic.Tests` and + `dotnet test tests/GameCult.Mesh.Quic.Native.Tests` without the env var + (the new tests `Assert.Ignore`, the existing ones still pass). +- Negative greps: `rg -n "setInterval|setTimeout" packages/cultmesh-ts/src/realtime-quic.ts` + must show no polling of the bridge (the pump is the only wait); + `rg -n "reconnect" packages/cultmesh-ts/src/realtime-quic.ts` must return + nothing on the provider side. +- Operator-only: none. + +## 11. Cut 6 (packaging and release) + +Purpose: a consumer host with no toolchain installs the binding. + +Adds: + +- `packages/cultmesh-quic-native/win32-x64/package.json` and + `packages/cultmesh-quic-native/linux-x64/package.json` (names per Q5), each + with `os`/`cpu` fields, `files` listing the two binaries and + `MSQUIC-LICENSE.txt`, no scripts, and a `README.md` naming the MsQuic + version and the build host. Their contents are copied from + `artifacts/quic-native/` by the publish job, never committed. +- `.github/workflows/publish-packages.yml`: tag prefixes `cultnet-ts-v*`, + `cultmesh-ts-v*`, `cultmesh-quic-native-v*` (`:20-24`); a `cultnet-ts` job + and a `cultmesh-ts` job shaped like the `cultcache-ts` job (`:40-76`); a + native job with two runners: `windows-latest` running + `scripts/build-quic-native.ps1`, and `ubuntu-latest` with + `container: debian:13` running `scripts/build-quic-native.sh` (Q6), each + publishing its platform package, then the `cultmesh-ts` job depends on both. +- `scripts/test-typescript-package-closure.mjs:9` adds the platform packages + to the pack list on the matching host and `:63-72` adds + `assert.equal(typeof mesh.CultMesh.createQuicRealtimeConnector, "function")` + plus a runtime smoke that opens and closes a `CultMeshQuicNativeRuntime` + from the installed tarballs (proves the optional dependency resolves and the + binaries load from `node_modules`, not from a repo path). +- `.github/workflows/cultnet-interop.yml` gains a step after the C# RUDP + step that builds the Windows bridge (`build-quic-native.ps1`) and runs the + `QUIC realtime` lanes with `CULTMESH_QUIC_NATIVE_DIR` set. Linux CI + coverage of the lanes needs a Linux runner with dotnet and the deb; add a + second job `interop-quic-linux` on `ubuntu-latest` + `container: debian:13` + running only the QUIC lanes. +- `README.md` of `packages/cultmesh-ts` gains a "QUIC Realtime Plane" section + after "RUDP Helpers" (`README.md:332`) with provider and consumer examples + matching the C# README (`src/GameCult.Mesh.Quic/README.md:13-62`). + +Verification: + +- `node scripts/test-typescript-package-closure.mjs` on Windows. +- Manual dispatch of `publish-packages.yml` with `package=cultmesh-ts` builds + and tests without publishing (`:24-32` semantics). +- Operator-only: the tag pushes that publish; `NPM_TOKEN` scope for new + package names; and the Yggdrasil verification: `ssh gamecultadmin@yggdrasil.gamecult.org`, + `mkdir /tmp/cultmesh-quic-smoke && cd $_ && npm init -y && npm i cultmesh-ts@`, + then `node -e "require('cultmesh-ts').CultMesh.createQuicRealtimeProvider({...}).then(p => { console.log(p.advertisedEndpoint); return p.dispose(); })"` + with a throwaway PKCS12 from `openssl`, followed by a loopback dial from a + second `node` process on the same host. `libmsquic`'s runtime dependencies + (`libssl3t64`, `libnuma1`, `libxdp1`, `libnl-route-3-200`, P7) must be + present on Yggdrasil; the smoke will say so if not. This is the only place + the Linux artifact is proven on the deploy host, and only the operator holds + the key. + +## 12. Cut 7 (documentation and ledgers) + +- `docs/runtime-parity-scope.md:38` TypeScript row: add "CultMesh QUIC + realtime provider and consumer over CultLib-owned MsQuic bindings (Windows + x64, Linux x64), byte-parity with C#, cross-process interop lanes" to + "Claimed parity"; add "QUIC datagrams (`Unreliable`), browser QUIC" to "Not + claimed". +- `src/GameCult.Mesh/docs/transport-planes.md:35-46`: name the TypeScript + provider/consumer beside the .NET and Unity bodies; `:122-125`: state that + `CULTMESH_NATIVE_EXTERNAL_ENDPOINT` now accepts any provider and is driven + by the TypeScript interop harness. +- `docs/cultnet-transport-parity.md`: no change. It maps RUDP/TCP/LiteNetLib + ownership; the realtime plane is a CultMesh plane, not a CultNet transport + profile, and pretending otherwise would put QUIC into a document whose cut + line says "Do not put UDP packet mechanics into CultMesh" the other way + round. +- `docs/parked-features.md`: one entry, "Node Odin WebSocket rendezvous", + pointing at `cultmesh-browser/src/index.ts:84-191` as the browser owner and + the `ICultMeshRealtimeLookupSource` port as the seam (Q7). +- `docs/typescript-quic-realtime-target.md:5-7`: status line updated to point + at this map. + +Verification: `rg -n "CultMeshRealtimeTransports.cs" docs src/GameCult.Mesh/docs` +returns only correct paths. + +## 13. Operator questions + +The four rulings in the target (Q1-Q4) are closed and not reopened. These are +the forks the probes surfaced. + +- **Q5. Registry names.** The binding cannot ship as prebuilt platform + packages without `cultmesh-ts` itself being on a registry, and today every + consumer uses `file:` paths and only `@gamecult/cultcache-ts` is published + (P15, P16). All candidate names are unclaimed (P14). A: publish `cultnet-ts` + and `cultmesh-ts` under their existing unscoped names (no import changes in + any of the 11 consuming repos) and put only the new native platform packages + under `@gamecult/cultmesh-quic-native-{win32-x64,linux-x64}`. B: scope + everything as `@gamecult/*` now and take the import rename across consumers + as a separate consumer task. C: no registry; ship the binaries inside the + CultLib tarball the deploy script already extracts on Yggdrasil + (`deploy-streampixels-preview.sh:95-99`), keeping `file:` consumption. + **Recommended: A.** It reshapes nothing consumers use, matches the + `cultcache-ts` precedent of scoping only what is new, and gives StreamPixels + a versioned artifact instead of a tarball with a `.so` in it. C is the + cheapest but leaves the deploy path owning a native binary by hand, which is + the failure the target's "shipped through a registry" phrase was written to + avoid. +- **Q6. Linux release builder.** A: GitHub Actions `ubuntu-latest` with + `container: debian:13` (same OS as Yggdrasil, P8), artifact published by the + workflow, verified on Yggdrasil by the operator smoke in cut 6. B: build on + Yggdrasil in the deploy script (installs CMake and g++ on a live public + host; every deploy compiles). C: build on Starfire's Docker `debian:13` + engine (P12) and publish from the workstation. **Recommended: A.** It is a + Linux host, it is reproducible from a tag, and it keeps compilers off + Yggdrasil. C is kept for the development loop only. +- **Q7. Node-side Odin rendezvous.** The TypeScript consumer needs a route + source. The browser package has an Odin WebSocket rendezvous + (`cultmesh-browser/src/index.ts:84-191`); Node 24 has a global `WebSocket`, + so it would run, but `cultmesh-ts` may not depend on `cultmesh-browser` + (Q2's spirit), and the first consumer of the Node QUIC path is the interop + harness, not a product. A: ship the lookup-source port plus a static source + now, park the Node Odin rendezvous with a note. B: move the Odin rendezvous + into `cultnet-ts` beside the verifier in this migration so Node and browser + share it. **Recommended: A.** B is the right end state but is a second + ownership move in one pipeline; it should follow once a Node consumer that + discovers through Odin exists. + +Not asked, because the target already decided them: datagrams stay out (Q4); +no TLS on TCP planes (Q1); Windows x64 and Linux x64 only (Q3); the verifier +moves to a shared browser-safe module (Q2, section 6 names the module). + +## 14. Subtraction estimate + +Both sides of the number, by cut, in source lines (tests included, generated +`dist*` excluded, vector JSON excluded): + +| Cut | Removed or replaced | Added | Net | +| --- | ---: | ---: | ---: | +| 1 trust module | 119 (browser) | 190 (module) + 150 (tests) + 40 (C# vector test) | +261 | +| 2 codec | 0 | 130 + 120 (TS test) + 120 (C# test) | +370 | +| 3 bridge | ~200 rewritten of 440 C++; 24 CMake | ~1,000 C++ (replacing 440), 60 CMake, 70 sh, 40 README | +~700 net C++/build | +| 4 consumer | 0 | 260 (binding) + 400 (consumer/session manager) + 400 (tests) + 200 (C# interop mode) + 150 (harness) + 120 (peer script) | +1,530 | +| 5 provider | 0 | 250 (provider) + 300 (tests) + 150 (harness) + 40 (C# tests) | +740 | +| 6 packaging | 0 | 60 (package manifests) + 130 (workflow) + 30 (closure smoke) + 60 (README) | +280 | +| 7 docs | ~10 | ~40 | +30 | +| Total | ~350 | ~4,260 | about +3,900 | + +Dependencies: +1 runtime dependency on `cultmesh-ts` (`koffi`, 1.7 MB, MIT, +loaded lazily); +2 optional platform packages; +0 build-time Node +dependencies (no node-gyp, no node-addon-api, no cmake-js). Targets: +0 .NET +projects (the C# interop peer gains one project reference); +1 CMake platform +branch; +1 shell build script; +3 publish jobs; +1 CI job. + +Why the number is positive and still acceptable: the target orders a new +capability (a QUIC realtime plane in a runtime that has none), and every line +above either is that capability, proves it against the C# reference, or ships +it. The subtraction that was available (one verifier instead of two, one +MsQuic body instead of two, one framing implementation per language instead +of one per host) is taken in cuts 1 and 3. Anything that would have shrunk +the number further (a third-party QUIC stack, a callback-driven addon, a +tarball with a `.so`) was rejected in section 4 for reasons that are not +about line count. + +## 15. Not assignable to a cut + +- **The Unity package release** carrying the rebuilt bridge DLL. The v1 ABI + is preserved, so no cut requires it, but the committed DLL will lag the + source until the operator runs `scripts/build-unity-package.ps1` and + commits. Recorded here so nobody reads the stale DLL as evidence the + rewrite did not happen. +- **StreamPixels certificate provisioning** (which PKCS12, where it lives on + Yggdrasil, how its pin reaches the Odin route). Consumer work by the target. +- **A nonce on the QUIC plane.** The target lists "a replayed nonce" among + trust negatives, but the QUIC plane has no nonce exchange in C# either + (`CultMeshQuicRealtimeTransport.cs` opens no session message; trust is the + Odin route plus the TLS pin, `transport-planes.md:71-73`). Cut 4 tests the + replay class that does exist (route generation). Adding a nonce is a + cross-runtime protocol change and needs its own target. +- **Linux coverage of the C# native connector.** `CanConnect` is Windows-only + (`CultMeshNativeQuicRealtimeTransport.cs:40`); the Linux interop job in cut 6 + therefore runs the TypeScript-provider-to-managed-connector lane and the + TypeScript-to-TypeScript lanes only. The native-connector lane is Windows + by design, matching where Unity runs. +- **The `cultcache-ts` naming split** across consumers (section 3). Out of + scope; noted because Q5's answer should not make it worse. + +## 16. Reminder of what a wrong cut looks like + +If a cut touches `src/GameCult.Mesh/CultMeshTcp*.cs`, adds TLS to the TCP +schema or content connectors, adds WebTransport to `cultmesh-browser`, adds +QUIC to `cultnet-py`, `cultnet-rs`, or `cultmesh-kotlin`, or edits anything +under `F:\Projects\StreamPixels`, it has left the target's "Not in this +migration" list and is wrong. Stop and re-read this map. From 3c29fc934d337cef616f1ebf5bbbdbb721b6c1b5 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 13:35:11 +0200 Subject: [PATCH 21/94] Record the Q5, Q6 and Q7 rulings in the QUIC cut map All three recommendations were taken: unscoped cultnet-ts and cultmesh-ts with only the native platform packages scoped; the Linux artifact built by GitHub Actions in a debian:13 container and smoked on Yggdrasil; the lookup source port plus a static source now, with the Node Odin rendezvous parked. The status header now says no operator question is open and cut 1 has not started, so a reader of the header alone knows where the campaign stands. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index d2416191..2834f42c 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -5,7 +5,8 @@ Date: 2026-09-16 Status: Imagination output for the target in `docs/typescript-quic-realtime-target.md` (operator-accepted 2026-09-16). No code in this document has been written. Nothing here is committed by -Imagination; the root agent commits. +Imagination; the root agent commits. Q5, Q6 and Q7 were ruled the same day +(section 13, Rulings); no operator question is open. Cut 1 has not started. Anchor: repo `F:\Projects\CultLib`, branch `main`, HEAD `f2cd2eb4641269c653977bdba9b4bce2a26d870c`. Every `file:line` below is read @@ -1001,6 +1002,25 @@ Not asked, because the target already decided them: datagrams stay out (Q4); no TLS on TCP planes (Q1); Windows x64 and Linux x64 only (Q3); the verifier moves to a shared browser-safe module (Q2, section 6 names the module). +### Rulings, 2026-09-16 + +The operator took all three recommendations the same day the map was written. +Each is now a standing ruling; the options above are history. + +- **Q5 ruled A.** `cultnet-ts` and `cultmesh-ts` publish under their existing + unscoped names. Only the two native platform packages are scoped: + `@gamecult/cultmesh-quic-native-win32-x64` and + `@gamecult/cultmesh-quic-native-linux-x64`. No consumer import changes. +- **Q6 ruled A.** The Linux release artifact is built by GitHub Actions on + `ubuntu-latest` inside `container: debian:13`, published by the workflow, + and verified by the operator smoke on Yggdrasil in cut 6. The Docker + `debian:13` engine on the workstation is the development loop only; nothing + it produces is a release artifact. No compiler is installed on Yggdrasil. +- **Q7 ruled A.** Cut 4 ships the `ICultMeshRealtimeLookupSource` port and a + static source. The Node Odin WebSocket rendezvous is parked with a note in + cut 7's ledger; it moves into `cultnet-ts` beside the verifier in a later + pipeline, once a Node consumer that discovers through Odin exists. + ## 14. Subtraction estimate Both sides of the number, by cut, in source lines (tests included, generated From 8d8ad568aa280bac34bf123503a9e38c175eb558 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 15:12:08 +0200 Subject: [PATCH 22/94] Re-rule Q5 to C: no registry, because npmjs is unreachable here Ruling A assumed a publish job whose token is minted by logging in to npmjs.com, and the operator's subnet is blocked there. That is also why the existing cultcache-ts publish job has never run. Consumers keep file: paths; the binaries ship in the CultLib tree the deploy path carries; the Actions build attaches the Linux artifact to a release. Cut 6 and the lines of Cuts 4 and 7 that assumed a registry are flagged for remapping. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index 2834f42c..544418f0 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -6,7 +6,10 @@ Status: Imagination output for the target in `docs/typescript-quic-realtime-target.md` (operator-accepted 2026-09-16). No code in this document has been written. Nothing here is committed by Imagination; the root agent commits. Q5, Q6 and Q7 were ruled the same day -(section 13, Rulings); no operator question is open. Cut 1 has not started. +(section 13, Rulings); Q5 was then re-ruled from A to C because npmjs is +unreachable from this network. **Cut 6 and the registry-dependent lines of +Cuts 4 and 7 are being remapped under C**; until that lands, their text +describes ruling A. No operator question is open. Cut 1 has not started. Anchor: repo `F:\Projects\CultLib`, branch `main`, HEAD `f2cd2eb4641269c653977bdba9b4bce2a26d870c`. Every `file:line` below is read @@ -1007,10 +1010,20 @@ moves to a shared browser-safe module (Q2, section 6 names the module). The operator took all three recommendations the same day the map was written. Each is now a standing ruling; the options above are history. -- **Q5 ruled A.** `cultnet-ts` and `cultmesh-ts` publish under their existing - unscoped names. Only the two native platform packages are scoped: - `@gamecult/cultmesh-quic-native-win32-x64` and - `@gamecult/cultmesh-quic-native-linux-x64`. No consumer import changes. +- **Q5 ruled A, then re-ruled C the same day.** A had `cultnet-ts` and + `cultmesh-ts` publishing under their unscoped names with only the two native + platform packages scoped. It fell to a Body fact the map had not recorded, + in the operator's words: "we don't even have npm access and cannot get it + because our entire subnet is blocked." The publish job needs an `NPM_TOKEN` + minted on npmjs.com by a logged-in user; nobody on this network can mint + one, which is also why the existing `cultcache-ts` job has never run. + **C stands: no registry.** Consumers keep `file:` paths. The native binaries + ship inside the CultLib tree the deploy path already carries, and Q6's + Actions build attaches the Linux artifact to a GitHub Release instead of + publishing a package. Q5's naming question dissolves with it. Cut 6 is + remapped under C below; Cut 4's binary resolution and Cut 7's ledgers + follow it. Any line in this map that still says "publish", "registry" or + "platform package" describes A and is history. - **Q6 ruled A.** The Linux release artifact is built by GitHub Actions on `ubuntu-latest` inside `container: debian:13`, published by the workflow, and verified by the operator smoke on Yggdrasil in cut 6. The Docker From 4a2fdafa6146418855e2153fcb5f954e0078bf9e Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 15:28:31 +0200 Subject: [PATCH 23/94] Remap Cut 6 under C: binaries in the tree, a release workflow, no registry The deploy tarball is a git archive of two package directories, so only committed files reach Yggdrasil and cultmesh-ts does not ride at all today. Under C the binding resolves binaries from an environment variable or the package's own native directory, a workflow builds the Linux artifact in a debian:13 container and attaches it to a release with a manifest and digests, and the operator smoke ships its own archive. Registry publication is parked with its seam named. One question remains: whether the four binaries are committed or fetched at deploy time. The corrected npm premise is recorded in the operator's words: reachable, publication deferred by choice. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 543 ++++++++++++++++++++++----- 1 file changed, 454 insertions(+), 89 deletions(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index 544418f0..63e23fec 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -6,14 +6,20 @@ Status: Imagination output for the target in `docs/typescript-quic-realtime-target.md` (operator-accepted 2026-09-16). No code in this document has been written. Nothing here is committed by Imagination; the root agent commits. Q5, Q6 and Q7 were ruled the same day -(section 13, Rulings); Q5 was then re-ruled from A to C because npmjs is -unreachable from this network. **Cut 6 and the registry-dependent lines of -Cuts 4 and 7 are being remapped under C**; until that lands, their text -describes ruling A. No operator question is open. Cut 1 has not started. +(section 13, Rulings); Q5 was then re-ruled from A to C: no registry in this +campaign, registry publication parked for a later pass by choice. Cut 6, +section 5.4, the binary-resolution and dependency lines of Cut 4, and Cut 7's +ledger are remapped under C (landed 2026-09-16, same day). One operator +question is open: Q8 in section 11, whether the built binaries are committed +to the tree or fetched from a GitHub Release by the deploy path. Cut 1 has +not started. Anchor: repo `F:\Projects\CultLib`, branch `main`, HEAD -`f2cd2eb4641269c653977bdba9b4bce2a26d870c`. Every `file:line` below is read -against that commit. If HEAD moves, re-anchor before cutting. +`8d8ad568aa280bac34bf123503a9e38c175eb558`. The three commits since the +original anchor `f2cd2eb4` (`bf9f6f7`, `3c29fc9`, `8d8ad56`) touch only this +document `(probe: git log --stat)`, so every `file:line` below, read against +`f2cd2eb4`, is still exact at `8d8ad568`. If HEAD moves, re-anchor before +cutting. How to read this document: section 1 prices the largest liability first, as the target requires, because if that price had turned out to dominate the @@ -35,13 +41,14 @@ Two corrections to the target, recorded here rather than silently absorbed: (`CultMeshRealtimeDelivery` at :8-13, `CultMeshRealtimeFrame` at :19-44, `ICultMeshRealtimeTransport` at :46-52, `ICultMeshRealtimeTransportConnector` at :55-63) `(source read)`. -- The target says the binding is "shipped through a registry". Today only - `@gamecult/cultcache-ts` has a registry publish job +- This map's first issue attributed the phrase "shipped through a registry" + to the target. The target contains no such phrase and no word "registry" + `(probe: rg)`; the reading was the map's, and it is withdrawn. What is + true: today only `@gamecult/cultcache-ts` has a registry publish job (`.github/workflows/publish-packages.yml:20-24`, `:40-76`); `cultnet-ts`, `cultmesh-ts` and `cultmesh-browser` have none, and every external consumer - reaches them by `file:` path (section 3). Registry delivery of the binding - therefore also means registry delivery of `cultnet-ts` and `cultmesh-ts`, - which is a naming decision the operator has not yet made. See Q5. + reaches them by `file:` path (section 3). Q5 was ruled C on that Body: no + registry in this campaign, publication parked. ## 1. The largest liability, priced first @@ -381,18 +388,40 @@ Sizing consequences: - Owner: `scripts/build-quic-native.ps1` (Windows x64) and the new `scripts/build-quic-native.sh` (Linux x64) own producing the bridge - artifact; `.github/workflows/publish-packages.yml` owns turning artifacts - into registry packages. + artifact; the new `.github/workflows/quic-native.yml` owns producing the + release-grade artifact for both platforms (Q6 A) and attaching it to a + GitHub Release; the committed tree `packages/cultmesh-ts/native/` owns + delivery to consumers (Q5 C): whatever carries the package directory (a + `git archive`, an `npm pack` tarball, a pnpm `file:` copy) carries the + binaries with it, and `packages/cultmesh-ts/native/MANIFEST.txt` plus + `SHA256SUMS` own provenance (MsQuic version, build host, digest per file). - Inputs: pinned MsQuic 2.5.9 (Schannel NuGet on Windows; `libmsquic` deb on - Linux) with SHA-256 checks; the bridge source. + Linux) with SHA-256 checks; the bridge source; the pinned `debian:13` image + digest for the Linux builder. - Outputs: `gamecult_mesh_quic_native.dll` + `msquic.dll` (win32-x64), - `libgamecult_mesh_quic_native.so` + `libmsquic.so.2` (linux-x64), each with - the MsQuic license. -- Derived state: `artifacts/` (git-ignored, `.gitignore:66`). -- Forbidden writers: no `postinstall` compile step in any published package; - a consumer host never needs CMake or a compiler. -- Deletion line: none; the Windows script is kept and the Unity package script - keeps calling it. + `libgamecult_mesh_quic_native.so` + `libmsquic.so.2` (linux-x64), the MsQuic + license, and the two provenance files. +- Derived state: `artifacts/` (git-ignored, `.gitignore:66`) is the + development-loop build output and never delivery; the Unity plugin copies at + `unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/` remain the Unity + package's own body (section 8, operator-only rebuild), not a source for + Node. +- Forbidden writers: no `postinstall` compile or download step in any + package; a consumer host never needs CMake, a compiler, or registry access + for the binding; no workflow commits binaries to `main` (the operator + commits from a Release asset whose digest the manifest records, Q8); + `realtime-quic-native.ts` never searches `node_modules` for a platform + package. +- Deletion line: the platform packages + `packages/cultmesh-quic-native/{win32-x64,linux-x64}` and + `optionalDependencies` from the ruling-A map are never created; the Windows + script is kept and the Unity package script keeps calling it. +- Parked seam (registry publication, later pass): the same `quic-native.yml` + artifacts are the payload a publish job would wrap; the reattachment point + is a `cultmesh-ts` job shaped like `publish-packages.yml:39-78` that depends + on the two build jobs, plus `optionalDependencies` in + `packages/cultmesh-ts/package.json` and a `node_modules` branch in the + resolver. None of that exists under C. ## 6. Cut 1 (subtraction): one TypeScript route verifier @@ -696,10 +725,16 @@ Deletes: none. Adds: - `packages/cultmesh-ts/src/realtime-quic-native.ts` (about 260 lines): the - koffi binding. Resolves the platform package (`@gamecult/cultmesh-quic-native-win32-x64` - or `-linux-x64`, Q5) or, when `CULTMESH_QUIC_NATIVE_DIR` is set, a directory - (this is how the repo's own tests point at `artifacts/quic-native/` - without a registry). Loads `msquic` first, then the bridge, by absolute path + koffi binding. Resolves the binary directory as `CULTMESH_QUIC_NATIVE_DIR` + when set (the development loop and CI point it at + `artifacts/quic-native/` straight from a build), otherwise + `path.join(__dirname, "..", "native", `${process.platform}-${process.arch}`)`, + the committed tree cut 6 lands (Q5 C; `__dirname` is `dist/` at runtime, so + the path holds in the repo, in an `npm pack` tarball, and in a pnpm `file:` + copy alike). No `node_modules` lookup, no platform package, no registry. + When neither directory holds `msquic` and the bridge, throw one error naming + both paths tried and the env var; until cut 6 lands, that is the error every + caller outside the test suite gets. Loads `msquic` first, then the bridge, by absolute path (the probe showed the dependent library must be resolvable before the bridge loads). Declares the twelve v2 prototypes. Exposes `CultMeshQuicNativeRuntime` with a single event pump: a loop that awaits @@ -736,11 +771,14 @@ Adds: beside the RUDP ones at `:6008-6186`: `parseQuicRealtimeEndpoint`, `createQuicRealtimeConnector(options)`, `createQuicRealtimeSessionManager(options)`, and in cut 5 `createQuicRealtimeProvider(options)`. -- `packages/cultmesh-ts/package.json:44-48` gains `"koffi": "3.3.0"` (exact) - and `optionalDependencies` for the two platform packages (names per Q5). - `koffi` is required lazily inside `realtime-quic-native.ts` so consumers - that never touch QUIC (AetheriaEve Electron, Odin, Stonks, weksa) load - nothing native. +- `packages/cultmesh-ts/package.json:44-48` gains `"koffi": "3.3.0"` (exact). + No `optionalDependencies`: under Q5 C the binaries are files of this + package, not packages of their own. `koffi` is required lazily inside + `realtime-quic-native.ts` so consumers that never touch QUIC (AetheriaEve + Electron, Odin, Stonks, weksa) load nothing native. `koffi` itself is a + registry dependency like `@msgpack/msgpack` (`:45`); every consumer host + already installs from the registry (`deploy-streampixels-preview.sh:102`), + so this adds no new kind of fetch. - `packages/cultmesh-ts/test/realtime-quic-native.test.ts` (about 150 lines): the cut-3 FFI smoke, now against the runtime class. - `packages/cultmesh-ts/test/realtime-quic-consumer.test.ts` (about 250 @@ -883,56 +921,354 @@ Verification: nothing on the provider side. - Operator-only: none. -## 11. Cut 6 (packaging and release) +## 11. Cut 6 (packaging and release, remapped under Q5 C) -Purpose: a consumer host with no toolchain installs the binding. +Purpose: a consumer host with no toolchain and no registry access for the +binding gets it by receiving the `cultmesh-ts` package directory, which is how +every consumer already receives the package (P16, P17). Registry publication +is parked, not ruled out; the seam it reattaches to is named at the end of +this section. -Adds: +### 11.1 Body facts this cut stands on -- `packages/cultmesh-quic-native/win32-x64/package.json` and - `packages/cultmesh-quic-native/linux-x64/package.json` (names per Q5), each - with `os`/`cpu` fields, `files` listing the two binaries and - `MSQUIC-LICENSE.txt`, no scripts, and a `README.md` naming the MsQuic - version and the build host. Their contents are copied from - `artifacts/quic-native/` by the publish job, never committed. -- `.github/workflows/publish-packages.yml`: tag prefixes `cultnet-ts-v*`, - `cultmesh-ts-v*`, `cultmesh-quic-native-v*` (`:20-24`); a `cultnet-ts` job - and a `cultmesh-ts` job shaped like the `cultcache-ts` job (`:40-76`); a - native job with two runners: `windows-latest` running - `scripts/build-quic-native.ps1`, and `ubuntu-latest` with - `container: debian:13` running `scripts/build-quic-native.sh` (Q6), each - publishing its platform package, then the `cultmesh-ts` job depends on both. -- `scripts/test-typescript-package-closure.mjs:9` adds the platform packages - to the pack list on the matching host and `:63-72` adds - `assert.equal(typeof mesh.CultMesh.createQuicRealtimeConnector, "function")` - plus a runtime smoke that opens and closes a `CultMeshQuicNativeRuntime` - from the installed tarballs (proves the optional dependency resolves and the - binaries load from `node_modules`, not from a repo path). -- `.github/workflows/cultnet-interop.yml` gains a step after the C# RUDP - step that builds the Windows bridge (`build-quic-native.ps1`) and runs the - `QUIC realtime` lanes with `CULTMESH_QUIC_NATIVE_DIR` set. Linux CI - coverage of the lanes needs a Linux runner with dotnet and the deb; add a - second job `interop-quic-linux` on `ubuntu-latest` + `container: debian:13` - running only the QUIC lanes. +- The deploy tarball is a `git archive`. The Idunn actuator on Starfire runs + `git -C CultLib archive --format=tar --output= origin/main packages/cultnet-ts packages/cultcache-ts` + (`F:\Projects\Odin\scripts\deploy-yggdrasil-streampixels.ps1:59`), uploads + it by `sftp` (`:127`), and `deploy-streampixels-preview.sh:95-99` extracts it + into `/srv/streampixels/CultLib` after deleting only those two package + directories (`:97`) `(source read)`. Two consequences: only committed files + ride (a `git archive` cannot carry untracked or ignored files), and + `packages/cultmesh-ts` is not in the archive today at all, although + StreamPixels declares it (`apps/service/package.json:26`). Adding it to the + archive list and to `:97` is deploy work in Odin and gamecult-ops, outside + this campaign (section 16); the Yggdrasil smoke below therefore ships its + own archive of the same shape rather than waiting on that change. +- pnpm materialises a `file:` directory dependency as a copy of the + package's `files` entries only: with `pnpm 10.33.0`, `node_modules/cultmesh-ts` + held `README.md`, `dist`, `package.json` and nothing else (no `src`, no + `test`) `(probe: scratch consumer with file: overrides)`. `files` is the + gate, so `native` must be listed in it. +- The MsQuic binaries the koffi probe loaded (P2) are the Unity plugin copies + at `unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/` (`probe.js:4-7`), + committed in plain git (`git ls-files`; `.gitattributes` is `* text=auto` + only, no LFS), `gamecult_mesh_quic_native.dll` 40,448 bytes and + `msquic.dll` 536,928 bytes `(probe)`. Committing binaries beside the code + that loads them is therefore existing practice in this repo, not a new one. +- The Linux runtime is one file: `libmsquic.so.2 -> libmsquic.so.2.5.9`, + 7,375,872 bytes, inside the pinned deb (P7); the deb also carries + `libmsquic.lttng.so.2.5.9` and `datapath_raw_xdp_kern.o`, neither needed + `(probe: dpkg-deb -c in debian:13)`. The repo pack is 31.68 MiB today + `(probe: git count-objects)`. +- `debian:13` resolved to digest + `sha256:f324c7ff54321e8d9c588493a20244965938ce0aa50bbd1022d38010e9ffc4b1` + on 2026-09-16 and carries `g++ 4:14.2.0-1` `(probe: docker pull; apt-cache + policy)`. The builder is pinned by that digest, not by the moving tag. +- `GameCult/CultLib` is public `(probe: gh repo view)` and already carries two + GitHub Releases with binary assets, `cultlib-unity-v1.0.3` + (`org.gamecult.cultlib-1.0.3.tgz`) and `gamecult-geometry-v0.1.0` (a crate + and nupkgs) `(probe: gh release view)`; nothing in `scripts/`, `docs/` or + `.github/` creates them, so they were cut by hand `(source read: rg)`. + Release assets on a public repo download with plain `curl`, no token. +- The npm registry is reachable from Starfire: `npm ping` answers `PONG`, + `npm view koffi` is HTTP 200, and `npm view @gamecult/cultcache-ts` is a + 404 because it was never published `(probe)`. This confirms the corrected + premise in section 13: C is deferral, not necessity. +- `.gitignore` ignores `artifacts/` (`:66`) and `node_modules`; it has no rule + for `*.so` or `*.dll` `(source read)`, so nothing blocks the commit path. +- The root `package-lock.json` is committed `(probe: git ls-files)`, so + `npm ci` is the real install path (as `publish-packages.yml:55` uses it); + `cultnet-interop.yml:95` uses `npm install --no-package-lock` instead, a + pre-existing inconsistency this cut does not touch. + +### 11.2 Q8, the fork C surfaces (operator decision, recommended option first) + +Where do the built binaries live so that the `git archive` above carries +them to the host? + +- **Option 1, commit them.** `packages/cultmesh-ts/native/{win32-x64,linux-x64}/` + hold the four binaries, committed by the operator from the Release assets + the workflow attaches, with `MANIFEST.txt` and `SHA256SUMS` beside them. + Price: about 8.0 MB in the tree (7,375,872 + 536,928 + 40,448 + the bridge + `.so`, on the order of 60 KB); pack growth roughly the compressed size, + about 3 MB, and that only when the MsQuic pin moves, because + `libmsquic.so.2` and `msquic.dll` are copies of Microsoft's files and + change with the pin, not with the bridge. A bridge rebuild adds tens of KB. + A CI job checks `sha256sum -c SHA256SUMS` on every push, so the manifest + and the bytes cannot drift. Deploy path change required: none beyond the + `packages/cultmesh-ts` archive-list fix already owed. Human step: download, + verify, commit (operator-only, section 11.7). +- **Option 2, fetch them.** `native//` is git-ignored; the tree + commits only `MANIFEST.txt`, `SHA256SUMS` and a `scripts/fetch-quic-native.mjs` + (about 80 lines) that downloads the Release assets and verifies digests. + Price: zero binary bytes in git, but every carrier of the package directory + becomes incomplete until the fetch runs: a fresh clone, every worktree, + Heimdall's vendored copy, `npm pack` (a tarball without binaries looks + valid), and the actuator, which must run the fetch and then `tar --append` + the ignored files after `git archive` (cross-repo edit in Odin), or the + deploy script must fetch from GitHub on Yggdrasil at deploy time (cross-repo + edit in gamecult-ops, plus GitHub egress the StreamPixels path does not + have today). It is the "tarball with a `.so` in it by hand" failure the + original Q5 text warned about, moved one step left. + +**Recommended: Option 1.** The tarball is a `git archive`, so committed is the +only state that rides it without a second mechanism; the repo already commits +the same `msquic.dll` for Unity; and the growth is bounded by the MsQuic pin, +not by bridge iteration. Everything below is written for Option 1; Option 2 +changes only 11.4's manifest paragraph, the closure smoke, and the operator +steps, and is not mapped further unless chosen. + +### 11.3 Deletes + +None in the tree. The ruling-A surfaces (`packages/cultmesh-quic-native/*`, +`optionalDependencies`, `cultnet-ts`/`cultmesh-ts` publish jobs, new tag +prefixes in `publish-packages.yml:20-24`) are never created; that is the +subtraction, and it is an estimate change, not a diff (section 11.8). + +The existing `@gamecult/cultcache-ts` publish job +(`.github/workflows/publish-packages.yml:39-78`) stays. It is out of this +campaign's scope: it publishes a package this migration does not touch, its +only consumer today reaches it by `file:` (`F:\Projects\Heimdall\package.json:22` +`(source read)`), and it is the shape the parked registry pass will copy for +`cultnet-ts` and `cultmesh-ts`. Whether it should run before then is a +question for that pass. + +### 11.4 Keeps and moves + +- `scripts/build-quic-native.ps1` and the Unity plugin binaries are untouched + (5.4 deletion line). `scripts/build-quic-native.sh` is the cut-3 script, + unchanged here. +- The MsQuic license text already committed at + `unity/org.gamecult.cultlib/Third Party Notices/MSQUIC-LICENSE.txt` is + copied, not referenced, to `packages/cultmesh-ts/native/MSQUIC-LICENSE.txt`, + because the package directory must be self-contained once copied out of the + repo (11.1, pnpm). Same MIT text for both platforms. + +### 11.5 Adds + +- `packages/cultmesh-ts/native/win32-x64/gamecult_mesh_quic_native.dll`, + `packages/cultmesh-ts/native/win32-x64/msquic.dll`, + `packages/cultmesh-ts/native/linux-x64/libgamecult_mesh_quic_native.so`, + `packages/cultmesh-ts/native/linux-x64/libmsquic.so.2` (the real file, not + the symlink; `RPATH $ORIGIN` from cut 3 resolves it beside the bridge). + Directory names are exactly `${process.platform}-${process.arch}` so the + cut-4 resolver needs no table. +- `packages/cultmesh-ts/native/SHA256SUMS`: `sha256sum` format, one line per + binary, relative paths, generated by the workflow and committed verbatim. +- `packages/cultmesh-ts/native/MANIFEST.txt` (about 20 lines, `key=value`): + `msquic.version=2.5.9`; `msquic.windows.source` = the NuGet URL at + `build-quic-native.ps1:30` with its SHA-256 from `:14`; + `msquic.linux.source` = the deb pool URL from P7 with its SHA-256; + `bridge.commit` = the CultLib commit the bridge was built from; + `build.workflow_run` = the Actions run URL; `build.release` = the Release + tag; `build.win32-x64.host` = runner image plus MSVC version as printed by + the job; `build.linux-x64.host` = `ubuntu-latest` plus the `debian:13` + digest plus `g++` version as printed; and the date. Every value is copied + from the run log by the operator, then the CI check below keeps the file + and the bytes agreeing. The binding never reads this file; it exists for + readers and for the digest check. +- `.github/workflows/quic-native.yml` (about 120 lines), four jobs: + - `build-win32-x64` on `windows-latest`: checkout, run + `scripts/build-quic-native.ps1 -OutputDirectory artifacts/quic-native/win32-x64`, + print `cl.exe` version and `Get-FileHash` of both files, upload + `actions/upload-artifact` named `quic-native-win32-x64`. + - `build-linux-x64` on `ubuntu-latest` with + `container: debian:13@sha256:f324c7ff54321e8d9c588493a20244965938ce0aa50bbd1022d38010e9ffc4b1` + (Q6 A; the digest is the pin, the tag is the label): `apt-get install -y + cmake ninja-build g++ curl ca-certificates dpkg`, run + `scripts/build-quic-native.sh`, print `g++ --version` and `sha256sum`, + upload `quic-native-linux-x64`. No Node in this job; loading is proven by + the interop job below, on the same image. + - `release`, `needs` both, `if: startsWith(github.ref, 'refs/tags/cultmesh-quic-native-v')`, + `permissions: contents: write`: download both artifacts, write + `SHA256SUMS` and a draft `MANIFEST.txt` with every value the jobs printed, + and run `gh release create "$GITHUB_REF_NAME" --verify-tag` with the two + per-platform `.tar.gz` files, `SHA256SUMS` and `MANIFEST.txt` as assets + (`GH_TOKEN: ${{ github.token }}`; `gh` is preinstalled on hosted runners, + no third-party release action). The release notes are the manifest. + - `verify-committed` on `push` and `pull_request`, `ubuntu-latest`, one + step: `cd packages/cultmesh-ts/native && sha256sum -c SHA256SUMS`. This is + the check that the tree's bytes are the bytes the manifest names. + - Triggers: `push` to `main` and `pull_request` run `verify-committed` + only; `workflow_dispatch` runs the two builds (dry run, uploads + artifacts, no release); a `cultmesh-quic-native-v*` tag runs all four. + Only `release` has write permission. +- `packages/cultmesh-ts/package.json:14-16`: `"files": ["dist", "native"]`. + No version bump: under C nothing keys on the version; provenance keys on + the commit in `MANIFEST.txt`. +- `packages/cultmesh-ts/src/realtime-quic-native.ts` (cut 4): the runtime + class gains a readonly `nativeDirectory` (the absolute directory it loaded + from). Diagnostic only; the closure smoke asserts on it. +- `scripts/test-typescript-package-closure.mjs`: + - `:39-41`: for `cultmesh-ts`, assert the packed file list contains all + four binaries, `native/SHA256SUMS`, `native/MANIFEST.txt` and + `native/MSQUIC-LICENSE.txt`, on every host (the tarball carries both + platforms; the host only decides which loads). + - `:59-70`: the runtime smoke adds + `assert.equal(typeof mesh.CultMesh.createQuicRealtimeConnector, "function")`, + the same for `createQuicRealtimeProvider`, then opens a + `CultMeshQuicNativeRuntime`, asserts + `runtime.nativeDirectory` ends with `node_modules/cultmesh-ts/native/` + (path separators normalised), and closes it. The child at `:70` runs with + `CULTMESH_QUIC_NATIVE_DIR` deleted from its env so the default path is the + one exercised. The point: the binaries load from the installed copy of the + package, not from a repo path or a registry. +- `.github/workflows/cultnet-interop.yml`: + - After the C# RUDP step (`:127-128`): a step building the Windows bridge + (`scripts/build-quic-native.ps1 -OutputDirectory artifacts/quic-native/win32-x64`) + and a step running the `QUIC realtime` lanes with + `CULTMESH_QUIC_NATIVE_DIR` set to that directory, so CI proves the lanes + against a fresh build, then a second run of + `node scripts/test-typescript-package-closure.mjs` proves the committed + Windows binaries load without the env var. + - A second job `interop-quic-linux` on `ubuntu-latest` with the same pinned + `debian:13` container: `apt-get install` the build tools plus `libicu` + (dotnet's runtime need), `actions/setup-dotnet@v4` 10.0.x and + `actions/setup-node@v4` 24 (both work inside a container), build the + bridge with `scripts/build-quic-native.sh`, `npm ci`, run only the + TypeScript-provider-to-managed-connector and TypeScript-to-TypeScript + lanes (section 15: the native-connector lane is Windows by design), then + the closure script without the env var. The container is not optional: + the artifact is linked against Debian 13's glibc 2.41 and `ubuntu-latest` + (24.04) carries glibc 2.39 `(probe: ldd --version in both images)`, so a + symbol version the bridge or `libmsquic` references can be absent on the + bare runner; run the lanes on the image the artifact targets rather than + discover that per symbol. - `README.md` of `packages/cultmesh-ts` gains a "QUIC Realtime Plane" section after "RUDP Helpers" (`README.md:332`) with provider and consumer examples - matching the C# README (`src/GameCult.Mesh.Quic/README.md:13-62`). + matching the C# README (`src/GameCult.Mesh.Quic/README.md:13-62`), and a + "Native binaries" paragraph: where they live, that a `file:` dependency or + an `npm pack` tarball carries them, the `CULTMESH_QUIC_NATIVE_DIR` + override, the two provenance files, Windows x64 and Linux x64 (Debian 13 + glibc) only, and the four `libmsquic` runtime dependencies (P7) a Linux host + must already have. -Verification: +### 11.6 Per-file changes -- `node scripts/test-typescript-package-closure.mjs` on Windows. -- Manual dispatch of `publish-packages.yml` with `package=cultmesh-ts` builds - and tests without publishing (`:24-32` semantics). -- Operator-only: the tag pushes that publish; `NPM_TOKEN` scope for new - package names; and the Yggdrasil verification: `ssh gamecultadmin@yggdrasil.gamecult.org`, - `mkdir /tmp/cultmesh-quic-smoke && cd $_ && npm init -y && npm i cultmesh-ts@`, - then `node -e "require('cultmesh-ts').CultMesh.createQuicRealtimeProvider({...}).then(p => { console.log(p.advertisedEndpoint); return p.dispose(); })"` - with a throwaway PKCS12 from `openssl`, followed by a loopback dial from a - second `node` process on the same host. `libmsquic`'s runtime dependencies - (`libssl3t64`, `libnuma1`, `libxdp1`, `libnl-route-3-200`, P7) must be - present on Yggdrasil; the smoke will say so if not. This is the only place - the Linux artifact is proven on the deploy host, and only the operator holds - the key. +- `packages/cultmesh-ts/package.json:14-16`, `files` gains `"native"`. +- `packages/cultmesh-ts/src/realtime-quic-native.ts` (cut 4 file), one + readonly field `nativeDirectory` set at load. +- `scripts/test-typescript-package-closure.mjs:39-41`, `:59-70` as above; + `:9` unchanged (no new packages). +- `.github/workflows/cultnet-interop.yml`, two steps after `:128`, one job + after `:140`. +- `.github/workflows/quic-native.yml`, new. +- `.github/workflows/publish-packages.yml`, unchanged. +- `packages/cultmesh-ts/native/` (seven files), new, four of them binary and + operator-committed (11.7). +- `packages/cultmesh-ts/README.md`, one section after `:332`. + +### 11.7 Verification + +- `node scripts/test-typescript-package-closure.mjs` on Windows, with + `CULTMESH_QUIC_NATIVE_DIR` unset in the shell. Pins: the tarball carries + both platforms and the provenance files; the installed copy loads its own + binaries. +- `cd packages/cultmesh-ts/native && sha256sum -c SHA256SUMS` (Git Bash on + Windows). Pins: committed bytes equal the manifest. +- `git check-ignore -v packages/cultmesh-ts/native/linux-x64/libmsquic.so.2` + must exit 1 (not ignored), and + `git ls-files packages/cultmesh-ts/native | wc -l` must print 7. Pins: the + binaries are tracked, so a `git archive` carries them. +- `npm pack packages/cultmesh-ts --dry-run --json | node -p "JSON.parse(require('fs').readFileSync(0,'utf8'))[0].files.map(f=>f.path).filter(p=>p.startsWith('native/')).join('\n')"` + must list seven `native/` paths; the closure script already asserts this, + this is the one-liner for a reader. +- `workflow_dispatch` of `quic-native.yml`: both build jobs green, artifacts + present, no release created. A tag push `cultmesh-quic-native-v` + creates the Release with four assets. Pins: Q6 A, the builder is a Linux + host on the deploy OS and the artifact has a public, digest-named home. +- Negative greps (must return nothing): + `rg -n "optionalDependencies|cultmesh-quic-native-(win32|linux)|@gamecult/cultmesh-quic-native" packages scripts .github --glob '!**/node_modules/**' --glob '!**/dist*/**'` + (no platform packages exist); + `rg -n "node_modules|require\.resolve" packages/cultmesh-ts/src/realtime-quic-native.ts` + (the resolver never searches for a package); + `rg -n "\"(pre|post)install\"" packages/*/package.json` (no install-time + compile or download); + `rg -n "NPM_TOKEN|npm publish|registry-url" .github/workflows/quic-native.yml` + (the native workflow publishes to no registry). +- Operator-only, in order: + 1. After the tag build, download the Release assets, compare every digest + with the run log and with `SHA256SUMS`, place the binaries under + `packages/cultmesh-ts/native//`, fill `MANIFEST.txt` from the + log, commit. This is the only path bytes take into the tree; no workflow + writes to `main`. + 2. Yggdrasil smoke, which installs from what C ships (the archived tree) + and nothing else. On Starfire, at the commit from step 1: + `git -C F:\Projects\CultLib archive --format=tar --output=$env:TEMP\cultlib-quic-smoke.tar ` + (the actuator's own mechanism, `deploy-yggdrasil-streampixels.ps1:51,59`, + whole tree), then `sftp` it to `gamecultadmin@yggdrasil.gamecult.org:/home/gamecultadmin/`. + On Yggdrasil: + `mkdir -p /tmp/cultmesh-quic-smoke && tar -xf ~/cultlib-quic-smoke.tar -C /tmp/cultmesh-quic-smoke && cd /tmp/cultmesh-quic-smoke`; + `(cd packages/cultmesh-ts/native && sha256sum -c SHA256SUMS)` (the bytes + that arrived are the bytes the manifest names); + `ldd packages/cultmesh-ts/native/linux-x64/libmsquic.so.2 | grep "not found"` + must print nothing. If it prints, the missing ones are among + `libnuma1`, `libxdp1`, `libnl-route-3-200` (P7; `libssl3t64` is base): + under C nothing installs them because the deb itself is never installed + on the host, so `sudo apt-get install` them once and record it in + `gamecult-ops/inventory.md` beside the Node line (`:660`). Then + `npm ci` (registry access from Yggdrasil is the deploy path's own + assumption, `deploy-streampixels-preview.sh:102`) and + `node scripts/test-typescript-package-closure.mjs` with the env var + unset: this is the same smoke CI runs, now on Node 24.14.1 (P8) on the + deploy host, loading `node_modules/cultmesh-ts/native/linux-x64`. + Then the handshake: `npm run test --workspace packages/cultmesh-ts` + (builds `dist-test` and runs the cut-4/5 suites on the host), then a + throwaway PKCS12 + (`openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 -nodes -subj /CN=127.0.0.1 -days 2 -keyout k.pem -out c.pem && openssl pkcs12 -export -inkey k.pem -in c.pem -passout pass:smoke -out smoke.p12`), + `node packages/cultmesh-ts/dist-test/test/interop/cultmesh-quic-peer.js serve --frames 5 --delivery latest-only --pkcs12 smoke.p12 --password smoke` + in one shell (it prints the advertised endpoint), and + `node packages/cultmesh-ts/dist-test/test/interop/cultmesh-quic-peer.js dial --endpoint --expect 5` + in a second, which must print five frames. If cut 5 landed `serve` with + a generated certificate instead of `--pkcs12/--password` flags, add the + flags in this cut; the smoke needs a certificate it can name. Finish + with `rm -rf /tmp/cultmesh-quic-smoke ~/cultlib-quic-smoke.tar`. This is + the only place the Linux artifact is proven on the deploy host, and only + the operator holds the key. + 3. Nothing here touches `/srv/streampixels`; StreamPixels adoption + (archive list, `:97`, its stale lockfile) is consumer work (section 15, + section 16). + +### 11.8 Subtraction estimate delta against section 14 + +Row 6 of the table read `0 removed, 60 (manifests) + 130 (workflow) + 30 +(closure) + 60 (README) = +280` with `+2 optional platform packages` and `+3 +publish jobs` in the dependencies line. Under C: + +- Removed: 0 (the `cultcache-ts` job stays, 11.3). +- Added text: about 120 (`quic-native.yml`) + 40 (interop workflow) + 30 + (closure) + 70 (README) + 25 (`MANIFEST.txt`, `SHA256SUMS`) + 1 + (`package.json`) = about +285, the same order as before; the 60 lines of + platform-package manifests are gone and the release/verify jobs take their + place. +- Added binary: four files, about 8.0 MB in the tree under Option 1, 0 under + Option 2. Section 14 has no column for this; it is the real price of C and + is stated here so it is not hidden in a line count. +- Dependencies line becomes: +0 optional platform packages (was +2); +0 + publish jobs (was +3); +1 workflow file with four jobs (two builds, one + release, one digest check) and +1 job in the interop workflow (was "+1 CI + job"). Runtime dependency unchanged: `koffi` only. +- Campaign total: about +3,900 source lines, unchanged; plus 8.0 MB of + committed binaries. + +### 11.9 Parked seam: registry publication (later pass) + +Not in this campaign, by the operator's choice (section 13). When it is +picked up, it reattaches here without remapping the rest: + +- `publish-packages.yml` gains `cultnet-ts` and `cultmesh-ts` jobs shaped like + `:39-78`, tag prefixes at `:20-24`, dispatch options at `:30-33`; the + `cultmesh-ts` job `needs` the two `quic-native.yml` build jobs (or the + workflow is merged) and publishes the artifacts they already produce as + `@gamecult/cultmesh-quic-native-{win32-x64,linux-x64}` platform packages. +- `packages/cultmesh-ts/package.json` gains `optionalDependencies` on those + two names; `realtime-quic-native.ts` gains a third resolution branch after + the env var and before the committed `native/` directory, or the committed + directory is retired in the same pass. +- Naming (unscoped `cultnet-ts`/`cultmesh-ts` versus `@gamecult/*`) is the + original Q5 A/B fork, still open for that pass; P14 recorded all names + unclaimed on 2026-09-16. +- Its Body precondition is an `NPM_TOKEN` repository secret minted on + npmjs.com, which the operator can now reach (section 13). ## 12. Cut 7 (documentation and ledgers) @@ -955,9 +1291,21 @@ Verification: the `ICultMeshRealtimeLookupSource` port as the seam (Q7). - `docs/typescript-quic-realtime-target.md:5-7`: status line updated to point at this map. +- Under Q5 C, the delivery story every document tells is the one in section + 11: the binding ships inside `packages/cultmesh-ts/native/`, provenance + lives in `MANIFEST.txt` and `SHA256SUMS`, and consumers keep `file:` paths. + `native/GameCult.Mesh.Quic.Native/README.md` (cut 3) and + `packages/cultmesh-ts/README.md` (cut 6) both point at `MANIFEST.txt` as the + provenance owner rather than restating versions or digests. The parity row + above says "bindings shipped in the `cultmesh-ts` package tree", not + "published". Registry publication is described in exactly one place, as + parked: section 11.9 of this map. Verification: `rg -n "CultMeshRealtimeTransports.cs" docs src/GameCult.Mesh/docs` -returns only correct paths. +returns only correct paths; +`rg -n -i "registry|npm publish|platform package|optionalDependencies" packages/cultmesh-ts/README.md native/GameCult.Mesh.Quic.Native/README.md docs/runtime-parity-scope.md src/GameCult.Mesh/docs/transport-planes.md` +returns nothing (the only permitted mentions are this map's sections 11.9 and +13 and the target's history). ## 13. Operator questions @@ -1012,18 +1360,23 @@ Each is now a standing ruling; the options above are history. - **Q5 ruled A, then re-ruled C the same day.** A had `cultnet-ts` and `cultmesh-ts` publishing under their unscoped names with only the two native - platform packages scoped. It fell to a Body fact the map had not recorded, - in the operator's words: "we don't even have npm access and cannot get it - because our entire subnet is blocked." The publish job needs an `NPM_TOKEN` - minted on npmjs.com by a logged-in user; nobody on this network can mint - one, which is also why the existing `cultcache-ts` job has never run. - **C stands: no registry.** Consumers keep `file:` paths. The native binaries - ship inside the CultLib tree the deploy path already carries, and Q6's - Actions build attaches the Linux artifact to a GitHub Release instead of - publishing a package. Q5's naming question dissolves with it. Cut 6 is - remapped under C below; Cut 4's binary resolution and Cut 7's ledgers - follow it. Any line in this map that still says "publish", "registry" or - "platform package" describes A and is history. + platform packages scoped. The re-ruling was first stated as necessity ("we + don't even have npm access and cannot get it because our entire subnet is + blocked"); the operator corrected that Body fact the same day after + reaching npm signup: "apparently that was true yesterday." The registry is + reachable from Starfire (`npm ping` answers, section 11.1 `(probe)`), and an + `NPM_TOKEN` can be minted. **C still stands for this campaign, by choice: + no registry.** In the operator's words, registry publication is "still for + a later pass". Consumers keep `file:` paths. The native binaries ship inside + the `cultmesh-ts` package tree that the deploy path's `git archive` carries, + and Q6's Actions build attaches both platform artifacts to a GitHub Release + instead of publishing packages. Registry publication of `cultnet-ts`, + `cultmesh-ts` and the native binaries is parked, not ruled out; section 11.9 + names the seam it reattaches to, and the original A/B naming fork stays + open for that pass. Cut 6 is remapped under C (section 11); section 5.4, + Cut 4's binary resolution and dependency lines, and Cut 7's ledger follow + it. The one fork C surfaces, whether the binaries are committed or fetched + from the Release, is Q8 in section 11.2 and is open. - **Q6 ruled A.** The Linux release artifact is built by GitHub Actions on `ubuntu-latest` inside `container: debian:13`, published by the workflow, and verified by the operator smoke on Yggdrasil in cut 6. The Docker @@ -1051,10 +1404,13 @@ Both sides of the number, by cut, in source lines (tests included, generated | Total | ~350 | ~4,260 | about +3,900 | Dependencies: +1 runtime dependency on `cultmesh-ts` (`koffi`, 1.7 MB, MIT, -loaded lazily); +2 optional platform packages; +0 build-time Node +loaded lazily); +0 optional platform packages; +0 build-time Node dependencies (no node-gyp, no node-addon-api, no cmake-js). Targets: +0 .NET projects (the C# interop peer gains one project reference); +1 CMake platform -branch; +1 shell build script; +3 publish jobs; +1 CI job. +branch; +1 shell build script; +1 workflow file with four jobs; +1 job in +the interop workflow; and, under Q8 option 1, about 8.0 MB of committed +binaries. *(This line first read "+2 optional platform packages; +3 publish +jobs; +1 CI job" under ruling A; section 11.8 carries the delta.)* Why the number is positive and still acceptable: the target orders a new capability (a QUIC realtime plane in a runtime that has none), and every line @@ -1087,7 +1443,16 @@ about line count. TypeScript-to-TypeScript lanes only. The native-connector lane is Windows by design, matching where Unity runs. - **The `cultcache-ts` naming split** across consumers (section 3). Out of - scope; noted because Q5's answer should not make it worse. + scope. Q5 C touches no package name and publishes nothing, so it makes the + split neither better nor worse; the split becomes the parked registry + pass's problem (section 11.9), where the A/B naming fork is still open. + One consequence to carry there: StreamPixels' lockfile resolves + `cultmesh-ts`'s cache dependency as unscoped `cultcache-ts` + (`F:\Projects\StreamPixels\pnpm-lock.yaml:2561-2564` `(source read)`) while + `packages/cultmesh-ts/package.json:46` now names `@gamecult/cultcache-ts`, + so a `pnpm install --frozen-lockfile` against the current tree would refuse + before any QUIC code is reached. Consumer work, recorded so the Yggdrasil + smoke in section 11.7 is not mistaken for StreamPixels adoption. ## 16. Reminder of what a wrong cut looks like From 1c12136872460e8126058a003e3ab3b81ec8416d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 15:57:33 +0200 Subject: [PATCH 24/94] Rule Q8: the native binaries are committed The deploy tarball is a git archive, so committed files are the only ones that reach Yggdrasil without a second mechanism, and the Windows pair is already committed for Unity. Four binaries, about eight megabytes, with a manifest and digests beside them. No operator question is open on this map. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index 63e23fec..c0f6f6a4 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -9,10 +9,9 @@ Imagination; the root agent commits. Q5, Q6 and Q7 were ruled the same day (section 13, Rulings); Q5 was then re-ruled from A to C: no registry in this campaign, registry publication parked for a later pass by choice. Cut 6, section 5.4, the binary-resolution and dependency lines of Cut 4, and Cut 7's -ledger are remapped under C (landed 2026-09-16, same day). One operator -question is open: Q8 in section 11, whether the built binaries are committed -to the tree or fetched from a GitHub Release by the deploy path. Cut 1 has -not started. +ledger are remapped under C (landed 2026-09-16, same day). Q8 is ruled: +the built binaries are committed to the tree (section 11.2). No operator +question is open. Cut 1 is in Hands. Anchor: repo `F:\Projects\CultLib`, branch `main`, HEAD `8d8ad568aa280bac34bf123503a9e38c175eb558`. The three commits since the @@ -1017,6 +1016,9 @@ not by bridge iteration. Everything below is written for Option 1; Option 2 changes only 11.4's manifest paragraph, the closure smoke, and the operator steps, and is not mapped further unless chosen. +**Ruled 2026-09-16: Option 1.** Operator: "Commit them, yeah." Option 2 is +history. + ### 11.3 Deletes None in the tree. The ruling-A surfaces (`packages/cultmesh-quic-native/*`, @@ -1376,7 +1378,11 @@ Each is now a standing ruling; the options above are history. open for that pass. Cut 6 is remapped under C (section 11); section 5.4, Cut 4's binary resolution and dependency lines, and Cut 7's ledger follow it. The one fork C surfaces, whether the binaries are committed or fetched - from the Release, is Q8 in section 11.2 and is open. + from the Release, is Q8 in section 11.2. +- **Q8 ruled Option 1.** The four native binaries are committed at + `packages/cultmesh-ts/native//` with their manifest and digests, + so they ride the `git archive` the deploy path already builds. Operator's + words: "Commit them, yeah." - **Q6 ruled A.** The Linux release artifact is built by GitHub Actions on `ubuntu-latest` inside `container: debian:13`, published by the workflow, and verified by the operator smoke on Yggdrasil in cut 6. The Docker From e234a64ae950fae8bf3361d8bc0d14cfe6c08423 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 15:59:09 +0200 Subject: [PATCH 25/94] Add the shared CultMesh route verifier to cultnet-ts Cut 1 of the TypeScript QUIC realtime plane: one TypeScript implementation of Odin root lookup, the validity window, the canonical route and session transcripts, P-256/P1363 verification, loopback detection and the protected-scheme rule, published as `cultnet-ts/authority`. Browser-safe by construction: WebCrypto, TextEncoder, atob/btoa, URL, DataView; no node: import, and a test that says so. The protected-scheme rule is the C# rule (wss, https, any scheme containing "quic") rather than wss-only, so the module is not wrong for QUIC routes; the browser client still refuses non-ws(s) endpoints itself. The transcript bytes are pinned by contracts/cultmesh/authority-route- vectors.json, written by the C# reference under CULTMESH_WRITE_VECTORS=1 with fixed test keys and otherwise re-verified by both runtimes. The vector carries a route certificate and a provider session proof. Co-Authored-By: Claude Fable 5.1 --- .../cultmesh/authority-route-vectors.json | 44 ++++ packages/cultnet-ts/package.json | 5 + packages/cultnet-ts/src/cultmesh-authority.ts | 192 ++++++++++++++ packages/cultnet-ts/src/index.ts | 18 ++ .../test/cultmesh-authority.test.ts | 238 ++++++++++++++++++ .../CultMeshAuthorityProofTests.cs | 128 ++++++++++ 6 files changed, 625 insertions(+) create mode 100644 contracts/cultmesh/authority-route-vectors.json create mode 100644 packages/cultnet-ts/src/cultmesh-authority.ts create mode 100644 packages/cultnet-ts/test/cultmesh-authority.test.ts diff --git a/contracts/cultmesh/authority-route-vectors.json b/contracts/cultmesh/authority-route-vectors.json new file mode 100644 index 00000000..76ec61f2 --- /dev/null +++ b/contracts/cultmesh/authority-route-vectors.json @@ -0,0 +1,44 @@ +{ + "nowUnixMilliseconds": 1800000000000, + "odinRoot": { + "keyId": "odin-vector", + "x": "shJLGtmRrW6D87VQKv0xYQekLIfEkeN7dVawwpmIKWM=", + "y": "iR6Gx3aVCghzSyo7TqXqr+1397L73KDNZuzN2cZ55IE=" + }, + "route": { + "verseId": "aetheria", + "authorityRuntimeId": "aetheria-daemon", + "endpoint": "wss://provider.example/mesh", + "protocolIds": [ + "cultmesh.content.v1", + "cultmesh.documents.v1" + ], + "priority": 7, + "generation": "vector-generation-1", + "certificate": { + "providerKey": { + "keyId": "provider-vector", + "x": "6XIvgx3W1q7lJFEV0yYbeKWNFgssq54BHBuh9gCwcH8=", + "y": "oi1FiKraueLic+VemzOx18MNwG6thmZMUWeqNw6vNOk=" + }, + "odinKeyId": "odin-vector", + "issuedAtUnixMilliseconds": 1799999940000, + "expiresAtUnixMilliseconds": 1800003600000, + "signature": "ZHuELFuCNNfbJt1T2mx1D9ZHXyxBedacDetmryMYhWKQxfROncltymkmL5KXl+1h8tDK6NytJCGy+7mYlb/DMA==" + } + }, + "sessionProof": { + "request": { + "schemaVersion": "cultmesh.session_open.v2", + "messageId": "vector-message-1", + "sourceRuntimeId": "vector-consumer", + "verseId": "aetheria", + "authorityRuntimeId": "aetheria-daemon", + "protocolId": "cultmesh.documents.v1", + "routeGeneration": "vector-generation-1", + "clientNonce": "VczqjH8NdBaOb+rh8xb6P0xZjWD1el2ReNB8Vbp52ko=" + }, + "providerKeyId": "provider-vector", + "providerSignature": "6kGxSu/pwcR4lzh/7Av9nhblVIwIwVFzB7kY34vVvkpaFAbAxt8mWqIyZDTftE28G1g+NL4Ea41C3QsuImmkaA==" + } +} diff --git a/packages/cultnet-ts/package.json b/packages/cultnet-ts/package.json index 2f4b74f1..d34278f5 100644 --- a/packages/cultnet-ts/package.json +++ b/packages/cultnet-ts/package.json @@ -14,6 +14,11 @@ "types": "./dist/contracts.d.ts", "require": "./dist/contracts.js", "default": "./dist/contracts.js" + }, + "./authority": { + "types": "./dist/cultmesh-authority.d.ts", + "require": "./dist/cultmesh-authority.js", + "default": "./dist/cultmesh-authority.js" } }, "files": [ diff --git a/packages/cultnet-ts/src/cultmesh-authority.ts b/packages/cultnet-ts/src/cultmesh-authority.ts new file mode 100644 index 00000000..c579f347 --- /dev/null +++ b/packages/cultnet-ts/src/cultmesh-authority.ts @@ -0,0 +1,192 @@ +// The one TypeScript implementation of CultMesh route verification. +// +// Browser-safe by construction: only `crypto.subtle`, `TextEncoder`, `atob`, +// `btoa`, `URL`, `DataView` and `Uint8Array`. No `node:` import. The browser +// WebSocket client and the Node realtime consumer verify the same route bytes +// through the same functions; the C# reference is +// `src/GameCult.Mesh/CultMeshAuthorityProof.cs`. + +import type { CultMeshSessionOpenMessage } from "./contracts"; + +export interface CultMeshAuthorityIdentity { + verseId: string; + authorityRuntimeId: string; +} + +export interface CultMeshAuthorityRouteView extends CultMeshAuthorityIdentity { + endpoint: string; + protocolId?: string; + protocolIds?: readonly string[]; + priority?: number; + generation: string; + certificate?: CultMeshAuthorityRouteCertificate; +} + +export interface CultMeshP256PublicKey { + keyId: string; + x: string; + y: string; +} + +export interface CultMeshAuthorityRouteCertificate { + providerKey: CultMeshP256PublicKey; + odinKeyId: string; + issuedAtUnixMilliseconds: number; + expiresAtUnixMilliseconds: number; + signature: string; +} + +export type CultMeshAuthorityTrustMode = "authenticated-remote" | "local-development"; + +export interface CultMeshAuthorityTrustPolicy { + mode: CultMeshAuthorityTrustMode; + odinRoots?: readonly CultMeshP256PublicKey[]; + now?: () => number; +} + +export async function verifyAuthorityRoute( + route: CultMeshAuthorityRouteView, + trust: CultMeshAuthorityTrustPolicy, +): Promise { + const certificate = route.certificate; + if (!certificate) { + if (trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint)) return; + throw new Error("Remote CultMesh routes require an Odin-signed authority certificate."); + } + if (!isProtectedEndpoint(route.endpoint) && !(trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint))) { + throw new Error("Authenticated remote CultMesh routes require TLS or QUIC channel protection."); + } + const now = trust.now?.() ?? Date.now(); + if (now < certificate.issuedAtUnixMilliseconds || now >= certificate.expiresAtUnixMilliseconds) { + throw new Error("The Odin route certificate is not currently valid."); + } + const root = trust.odinRoots?.find(candidate => candidate.keyId === certificate.odinKeyId); + if (!root) throw new Error(`Odin key '${certificate.odinKeyId}' is not trusted by this consumer.`); + if (!await verifyP256(root, canonicalRoute(route), certificate.signature)) { + throw new Error("The Odin route certificate signature is invalid."); + } +} + +/** Verifies the provider's session proof over the accepted handshake. */ +export function verifyProviderSessionProof( + request: CultMeshSessionOpenMessage, + endpoint: string, + providerKey: CultMeshP256PublicKey, + signatureBase64: string, +): Promise { + return verifyP256(providerKey, canonicalSession(request, endpoint), signatureBase64); +} + +export function canonicalRoute(route: CultMeshAuthorityRouteView): Uint8Array { + const certificate = route.certificate!; + return canonicalFields( + "gamecult.cultmesh.route-certificate.v1", + route.verseId, + route.authorityRuntimeId, + route.endpoint, + [...(route.protocolIds ?? [route.protocolId ?? "cultmesh.documents.v1"])].sort().join(""), + String(route.priority ?? 0), + route.generation, + certificate.providerKey.keyId, + certificate.providerKey.x, + certificate.providerKey.y, + certificate.odinKeyId, + String(certificate.issuedAtUnixMilliseconds), + String(certificate.expiresAtUnixMilliseconds), + ); +} + +export function canonicalSession(request: CultMeshSessionOpenMessage, endpoint: string): Uint8Array { + return canonicalFields( + "gamecult.cultmesh.session-proof.v1", + request.clientNonce, + request.messageId, + request.sourceRuntimeId, + request.verseId, + request.authorityRuntimeId, + request.protocolId, + endpoint, + request.routeGeneration, + ); +} + +export function canonicalFields(...values: string[]): Uint8Array { + const encoder = new TextEncoder(); + const encoded = values.map(value => encoder.encode(value)); + const total = encoded.reduce((sum, value) => sum + 4 + value.byteLength, 0); + const result = new Uint8Array(total); + const view = new DataView(result.buffer); + let offset = 0; + for (const value of encoded) { + view.setUint32(offset, value.byteLength, false); + offset += 4; + result.set(value, offset); + offset += value.byteLength; + } + return result; +} + +export async function verifyP256( + key: CultMeshP256PublicKey, + payload: Uint8Array, + signatureBase64: string, +): Promise { + try { + const x = base64ToBytes(key.x); + const y = base64ToBytes(key.y); + const signature = base64ToBytes(signatureBase64); + if (x.byteLength !== 32 || y.byteLength !== 32 || signature.byteLength !== 64) return false; + const raw = new Uint8Array(65); + raw[0] = 4; + raw.set(x, 1); + raw.set(y, 33); + const publicKey = await crypto.subtle.importKey( + "raw", + raw.slice().buffer as ArrayBuffer, + { name: "ECDSA", namedCurve: "P-256" }, + false, + ["verify"], + ); + return await crypto.subtle.verify( + { name: "ECDSA", hash: "SHA-256" }, + publicKey, + signature.slice().buffer as ArrayBuffer, + payload.slice().buffer as ArrayBuffer, + ); + } catch { + return false; + } +} + +export function isLoopbackEndpoint(value: string): boolean { + try { + const host = new URL(value).hostname.replace(/^\[|\]$/g, "").toLowerCase(); + return host === "localhost" || host === "127.0.0.1" || host === "::1"; + } catch { + return false; + } +} + +/** The C# rule (`CultMeshAuthorityProof.cs`, `IsProtected`): wss, https, or any scheme containing "quic". */ +export function isProtectedEndpoint(value: string): boolean { + let scheme: string; + try { + scheme = new URL(value).protocol.slice(0, -1).toLowerCase(); + } catch { + return false; + } + return scheme === "wss" || scheme === "https" || scheme.includes("quic"); +} + +export function bytesToBase64(bytes: Uint8Array): string { + let binary = ""; + for (let offset = 0; offset < bytes.length; offset += 0x8000) { + binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000)); + } + return btoa(binary); +} + +export function base64ToBytes(value: string): Uint8Array { + const binary = atob(value); + return Uint8Array.from(binary, character => character.charCodeAt(0)); +} diff --git a/packages/cultnet-ts/src/index.ts b/packages/cultnet-ts/src/index.ts index 140526c5..e9260122 100644 --- a/packages/cultnet-ts/src/index.ts +++ b/packages/cultnet-ts/src/index.ts @@ -62,6 +62,24 @@ export { type GhostlightVariableMap, type GhostlightWorldState, } from "./contracts"; +export { + base64ToBytes, + bytesToBase64, + canonicalFields, + canonicalRoute, + canonicalSession, + isLoopbackEndpoint, + isProtectedEndpoint, + verifyAuthorityRoute, + verifyP256, + verifyProviderSessionProof, + type CultMeshAuthorityIdentity, + type CultMeshAuthorityRouteCertificate, + type CultMeshAuthorityRouteView, + type CultMeshAuthorityTrustMode, + type CultMeshAuthorityTrustPolicy, + type CultMeshP256PublicKey, +} from "./cultmesh-authority"; export { encodeFrame, LengthPrefixedMessageFramer } from "./framing"; export { CultNetPeer, createTcpFramedCultNetPeer, type CultNetPeerEvents, type CultNetPeerSchemaCatalogRequestOptions, type CultNetPeerShardCatalogRequestOptions, type TcpFramedCultNetPeerOptions } from "./peer"; export { diff --git a/packages/cultnet-ts/test/cultmesh-authority.test.ts b/packages/cultnet-ts/test/cultmesh-authority.test.ts new file mode 100644 index 00000000..cb3a62da --- /dev/null +++ b/packages/cultnet-ts/test/cultmesh-authority.test.ts @@ -0,0 +1,238 @@ +// The shared CultMesh route verifier, pinned rule by rule. +// +// Routes here are signed with `node:crypto` and verified through the shared +// module. The transcript bytes themselves are pinned by +// `contracts/cultmesh/authority-route-vectors.json`, which the C# reference +// writes (`CultMeshAuthorityProofTests.AuthorityRouteVectorsAreSharedWithTypeScript` +// under CULTMESH_WRITE_VECTORS=1); a fixture authored on this side alone would +// only agree with itself. + +import test from "node:test"; +import assert from "node:assert/strict"; +import { generateKeyPairSync, sign, type KeyObject } from "node:crypto"; +import { readFileSync } from "node:fs"; +import { join } from "node:path"; + +import type { CultMeshSessionOpenMessage } from "../src/contracts"; +import { + base64ToBytes, + bytesToBase64, + canonicalRoute, + canonicalSession, + isLoopbackEndpoint, + isProtectedEndpoint, + verifyAuthorityRoute, + verifyP256, + verifyProviderSessionProof, + type CultMeshAuthorityRouteView, + type CultMeshP256PublicKey, +} from "../src/cultmesh-authority"; + +const NOW = 1_800_000_000_000; +const VECTORS_PATH = join(__dirname, "..", "..", "..", "..", "contracts", "cultmesh", "authority-route-vectors.json"); + +interface Vectors { + nowUnixMilliseconds: number; + odinRoot: CultMeshP256PublicKey; + route: CultMeshAuthorityRouteView; + sessionProof: { + request: CultMeshSessionOpenMessage; + providerKeyId: string; + providerSignature: string; + }; +} + +function keyPair(keyId: string): { privateKey: KeyObject; publicKey: CultMeshP256PublicKey } { + const pair = generateKeyPairSync("ec", { namedCurve: "P-256" }); + const jwk = pair.publicKey.export({ format: "jwk" }); + return { + privateKey: pair.privateKey, + publicKey: { + keyId, + x: Buffer.from(jwk.x!, "base64url").toString("base64"), + y: Buffer.from(jwk.y!, "base64url").toString("base64"), + }, + }; +} + +function signP1363(privateKey: KeyObject, payload: Uint8Array): string { + return sign("sha256", payload, { key: privateKey, dsaEncoding: "ieee-p1363" }).toString("base64"); +} + +function signedRoute(endpoint = "wss://provider.example/mesh") { + const odin = keyPair("odin-root-1"); + const provider = keyPair("provider-1"); + const unsigned: CultMeshAuthorityRouteView = { + verseId: "sample.counter", + authorityRuntimeId: "sample.counter-daemon", + endpoint, + protocolId: "cultmesh.documents.v1", + protocolIds: ["cultmesh.documents.v1"], + priority: 0, + generation: "signed-generation-1", + certificate: { + providerKey: provider.publicKey, + odinKeyId: odin.publicKey.keyId, + issuedAtUnixMilliseconds: NOW - 60_000, + expiresAtUnixMilliseconds: NOW + 3_600_000, + signature: "", + }, + }; + const route: CultMeshAuthorityRouteView = { + ...unsigned, + certificate: { ...unsigned.certificate!, signature: signP1363(odin.privateKey, canonicalRoute(unsigned)) }, + }; + return { route, odin, provider }; +} + +function request(clientNonce = "nonce-a"): CultMeshSessionOpenMessage { + return { + schemaVersion: "cultmesh.session_open.v2", + messageId: "message-1", + sourceRuntimeId: "consumer-1", + verseId: "sample.counter", + authorityRuntimeId: "sample.counter-daemon", + protocolId: "cultmesh.documents.v1", + routeGeneration: "signed-generation-1", + clientNonce, + }; +} + +const remoteTrust = (odinRoot: CultMeshP256PublicKey, now: number = NOW) => + ({ mode: "authenticated-remote" as const, odinRoots: [odinRoot], now: () => now }); + +test("a signed remote route verifies against its Odin root", async () => { + const { route, odin } = signedRoute(); + await verifyAuthorityRoute(route, remoteTrust(odin.publicKey)); +}); + +test("an unsigned remote route is refused in both trust modes", async () => { + const { route } = signedRoute(); + const unsigned = { ...route, certificate: undefined }; + await assert.rejects(verifyAuthorityRoute(unsigned, { mode: "authenticated-remote" }), /Odin-signed authority certificate/); + await assert.rejects(verifyAuthorityRoute(unsigned, { mode: "local-development" }), /Odin-signed authority certificate/); +}); + +test("an unsigned loopback route is accepted only under local-development", async () => { + const { route } = signedRoute("ws://127.0.0.1:4050/mesh"); + const unsigned = { ...route, certificate: undefined }; + await verifyAuthorityRoute(unsigned, { mode: "local-development" }); + await assert.rejects(verifyAuthorityRoute(unsigned, { mode: "authenticated-remote" }), /Odin-signed authority certificate/); +}); + +test("a certified route on an unprotected scheme is refused unless it is loopback under local-development", async () => { + const remote = signedRoute("ws://provider.example/mesh"); + await assert.rejects(verifyAuthorityRoute(remote.route, remoteTrust(remote.odin.publicKey)), /channel protection/); + const loopback = signedRoute("ws://localhost:4050/mesh"); + await assert.rejects(verifyAuthorityRoute(loopback.route, remoteTrust(loopback.odin.publicKey)), /channel protection/); + await verifyAuthorityRoute(loopback.route, { ...remoteTrust(loopback.odin.publicKey), mode: "local-development" }); +}); + +test("the validity window is half-open: issuedAt inclusive, expiresAt exclusive", async () => { + const { route, odin } = signedRoute(); + const certificate = route.certificate!; + await verifyAuthorityRoute(route, remoteTrust(odin.publicKey, certificate.issuedAtUnixMilliseconds)); + await verifyAuthorityRoute(route, remoteTrust(odin.publicKey, certificate.expiresAtUnixMilliseconds - 1)); + await assert.rejects( + verifyAuthorityRoute(route, remoteTrust(odin.publicKey, certificate.expiresAtUnixMilliseconds)), + /not currently valid/, + ); + await assert.rejects( + verifyAuthorityRoute(route, remoteTrust(odin.publicKey, certificate.issuedAtUnixMilliseconds - 1)), + /not currently valid/, + ); +}); + +test("an Odin root the consumer does not trust is refused before any signature check", async () => { + const { route } = signedRoute(); + const stranger = keyPair("odin-root-1"); + await assert.rejects(verifyAuthorityRoute(route, { mode: "authenticated-remote", odinRoots: [], now: () => NOW }), /is not trusted/); + await assert.rejects( + verifyAuthorityRoute(route, { mode: "authenticated-remote", odinRoots: [{ ...stranger.publicKey, keyId: "other-root" }], now: () => NOW }), + /is not trusted/, + ); + await assert.rejects(verifyAuthorityRoute(route, remoteTrust(stranger.publicKey)), /signature is invalid/); +}); + +test("a mutated endpoint invalidates the Odin signature", async () => { + const { route, odin } = signedRoute(); + await assert.rejects( + verifyAuthorityRoute({ ...route, endpoint: "wss://evil.example/mesh" }, remoteTrust(odin.publicKey)), + /signature is invalid/, + ); +}); + +test("a signature that is not 64 P1363 bytes is refused", async () => { + const { route, odin } = signedRoute(); + const bytes = base64ToBytes(route.certificate!.signature); + for (const wrong of [bytes.subarray(0, 63), new Uint8Array([...bytes, 0])]) { + await assert.rejects( + verifyAuthorityRoute( + { ...route, certificate: { ...route.certificate!, signature: bytesToBase64(wrong) } }, + remoteTrust(odin.publicKey), + ), + /signature is invalid/, + ); + } + assert.equal(await verifyP256(odin.publicKey, canonicalRoute(route), "not base64!"), false); +}); + +test("the provider session proof binds the nonce, the endpoint and the certified key", async () => { + const { route, provider } = signedRoute(); + const open = request(); + const signature = signP1363(provider.privateKey, canonicalSession(open, route.endpoint)); + assert.equal(await verifyProviderSessionProof(open, route.endpoint, provider.publicKey, signature), true); + assert.equal(await verifyProviderSessionProof(request("nonce-b"), route.endpoint, provider.publicKey, signature), false); + assert.equal(await verifyProviderSessionProof(open, "wss://evil.example/mesh", provider.publicKey, signature), false); + assert.equal(await verifyProviderSessionProof(open, route.endpoint, keyPair("provider-1").publicKey, signature), false); +}); + +test("isProtectedEndpoint is the C# rule: wss, https, or any scheme containing quic", () => { + for (const accepted of ["wss://provider.example/mesh", "https://provider.example/content", "cultmesh-state+quic://provider.example:4433"]) { + assert.equal(isProtectedEndpoint(accepted), true, accepted); + } + for (const refused of ["ws://provider.example/mesh", "cultnet+tcp://provider.example:3076", "not a url"]) { + assert.equal(isProtectedEndpoint(refused), false, refused); + } +}); + +test("isLoopbackEndpoint recognises localhost, 127.0.0.1 and ::1 only", () => { + for (const loopback of ["ws://localhost:4050/mesh", "ws://127.0.0.1:4050/mesh", "ws://[::1]:4050/mesh", "wss://LOCALHOST/mesh"]) { + assert.equal(isLoopbackEndpoint(loopback), true, loopback); + } + for (const remote of ["ws://192.0.2.10:4050/mesh", "wss://provider.example/mesh", "ws://127.0.0.2/mesh", "not a url"]) { + assert.equal(isLoopbackEndpoint(remote), false, remote); + } +}); + +test("base64 helpers round-trip across the 32 KiB chunk boundary", () => { + const bytes = new Uint8Array(70_000).map((_, index) => index % 251); + assert.deepEqual(base64ToBytes(bytesToBase64(bytes)), bytes); +}); + +test("the C# reference vectors verify through the shared module", async () => { + const vectors = JSON.parse(readFileSync(VECTORS_PATH, "utf8")) as Vectors; + const trust = { mode: "authenticated-remote" as const, odinRoots: [vectors.odinRoot], now: () => vectors.nowUnixMilliseconds }; + await verifyAuthorityRoute(vectors.route, trust); + await assert.rejects(verifyAuthorityRoute({ ...vectors.route, priority: 8 }, trust), /signature is invalid/); + await assert.rejects( + verifyAuthorityRoute({ ...vectors.route, protocolIds: [...vectors.route.protocolIds!, "cultmesh.realtime.v1"] }, trust), + /signature is invalid/, + ); + + const proof = vectors.sessionProof; + assert.equal(proof.providerKeyId, vectors.route.certificate!.providerKey.keyId); + assert.equal( + await verifyProviderSessionProof(proof.request, vectors.route.endpoint, vectors.route.certificate!.providerKey, proof.providerSignature), + true, + ); + assert.equal( + await verifyProviderSessionProof({ ...proof.request, clientNonce: "replayed" }, vectors.route.endpoint, vectors.route.certificate!.providerKey, proof.providerSignature), + false, + ); +}); + +test("the shared module keeps the browser-safe surface: no node: import", () => { + const source = readFileSync(join(__dirname, "..", "..", "src", "cultmesh-authority.ts"), "utf8"); + assert.doesNotMatch(source, /from "node:|require\("node:/); +}); diff --git a/tests/GameCult.Mesh.Tests/CultMeshAuthorityProofTests.cs b/tests/GameCult.Mesh.Tests/CultMeshAuthorityProofTests.cs index 42f02297..44c078cc 100644 --- a/tests/GameCult.Mesh.Tests/CultMeshAuthorityProofTests.cs +++ b/tests/GameCult.Mesh.Tests/CultMeshAuthorityProofTests.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Net; using System.Net.Http; using System.Security.Cryptography; using System.Text; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; using FluentAssertions; @@ -225,6 +227,132 @@ public sealed class CultMeshAuthorityProofTests handler.RequestUri.Query.Should().Contain("chunkHash=").And.Contain("recordKey="); } + // Shared-vector check with `packages/cultnet-ts/src/cultmesh-authority.ts`. + // The C# reference signs a route and a session proof with fixed keys and + // writes them when CULTMESH_WRITE_VECTORS=1; otherwise it asserts the + // committed file still verifies here. The TypeScript test verifies the same + // file, so both runtimes are pinned to the same transcript bytes. + [Test] + public void AuthorityRouteVectorsAreSharedWithTypeScript() + { + var path = Path.Combine(RepoRoot(), "contracts", "cultmesh", "authority-route-vectors.json"); + using var odin = ECDsa.Create(); + odin.ImportFromPem(VectorOdinPrivateKeyPem); + using var provider = ECDsa.Create(); + provider.ImportFromPem(VectorProviderPrivateKeyPem); + var odinPublic = CultMeshEcdsaP256PublicKey.From("odin-vector", odin); + var providerPublic = CultMeshEcdsaP256PublicKey.From("provider-vector", provider); + var request = new GameCult.Networking.CultMeshSessionOpenMessage + { + MessageId = "vector-message-1", + SourceRuntimeId = "vector-consumer", + VerseId = "aetheria", + AuthorityRuntimeId = "aetheria-daemon", + ProtocolId = CultMeshProtocols.Documents.Value, + RouteGeneration = "vector-generation-1", + ClientNonce = Convert.ToBase64String(SHA256.HashData(Encoding.UTF8.GetBytes("vector-nonce"))) + }; + + if (Environment.GetEnvironmentVariable("CULTMESH_WRITE_VECTORS") == "1") + { + var signedRoute = CultMeshAuthorityProof.CreateSignedRoute( + "aetheria", "aetheria-daemon", "wss://provider.example/mesh", + new[] { CultMeshProtocols.Documents.Value, CultMeshProtocols.Content.Value }, 7, "vector-generation-1", + providerPublic, odinPublic.KeyId, Now.AddMinutes(-1), Now.AddHours(1), odin); + var signer = new CultMeshSessionProofSigner(signedRoute, provider); + Directory.CreateDirectory(Path.GetDirectoryName(path)!); + File.WriteAllText(path, JsonSerializer.Serialize(new + { + nowUnixMilliseconds = Now.ToUnixTimeMilliseconds(), + odinRoot = new { keyId = odinPublic.KeyId, x = odinPublic.X, y = odinPublic.Y }, + route = new + { + verseId = "aetheria", + authorityRuntimeId = signedRoute.AuthorityRuntimeId, + endpoint = signedRoute.Endpoint, + protocolIds = signedRoute.ProtocolIds, + priority = signedRoute.Priority, + generation = signedRoute.Generation, + certificate = new + { + providerKey = new { keyId = providerPublic.KeyId, x = providerPublic.X, y = providerPublic.Y }, + odinKeyId = signedRoute.Certificate!.OdinKeyId, + issuedAtUnixMilliseconds = signedRoute.Certificate.IssuedAtUnixMilliseconds, + expiresAtUnixMilliseconds = signedRoute.Certificate.ExpiresAtUnixMilliseconds, + signature = signedRoute.Certificate.Signature + } + }, + sessionProof = new + { + request = new + { + schemaVersion = request.SchemaVersion, + messageId = request.MessageId, + sourceRuntimeId = request.SourceRuntimeId, + verseId = request.VerseId, + authorityRuntimeId = request.AuthorityRuntimeId, + protocolId = request.ProtocolId, + routeGeneration = request.RouteGeneration, + clientNonce = request.ClientNonce + }, + providerKeyId = signer.ProviderKeyId, + providerSignature = signer.Sign(request) + } + }, new JsonSerializerOptions + { + WriteIndented = true, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }) + "\n"); + } + + using var vectors = JsonDocument.Parse(File.ReadAllText(path)); + var rootElement = vectors.RootElement; + var routeElement = rootElement.GetProperty("route"); + var certificateElement = routeElement.GetProperty("certificate"); + var route = new CultMeshAuthorityRoute( + routeElement.GetProperty("authorityRuntimeId").GetString()!, + routeElement.GetProperty("endpoint").GetString()!, + routeElement.GetProperty("protocolIds").EnumerateArray().Select(value => value.GetString()!).ToArray(), + routeElement.GetProperty("priority").GetInt32(), + routeElement.GetProperty("generation").GetString(), + new CultMeshRouteCertificate( + providerPublic, + certificateElement.GetProperty("odinKeyId").GetString()!, + certificateElement.GetProperty("issuedAtUnixMilliseconds").GetInt64(), + certificateElement.GetProperty("expiresAtUnixMilliseconds").GetInt64(), + certificateElement.GetProperty("signature").GetString()!)); + var trust = new CultMeshAuthorityTrustPolicy(CultMeshAuthorityTrustMode.AuthenticatedRemote, new[] { odinPublic }); + var now = DateTimeOffset.FromUnixTimeMilliseconds(rootElement.GetProperty("nowUnixMilliseconds").GetInt64()); + var verseId = routeElement.GetProperty("verseId").GetString()!; + + trust.Validate(verseId, route, now); + var proofElement = rootElement.GetProperty("sessionProof"); + var accepted = Accepted(request, proofElement.GetProperty("providerSignature").GetString()!); + accepted.ProviderKeyId = proofElement.GetProperty("providerKeyId").GetString()!; + CultMeshAuthorityProof.VerifySessionProof(request, accepted, verseId, route, trust, now).Should().BeTrue(); + } + + private static string RepoRoot() + { + var directory = new DirectoryInfo(TestContext.CurrentContext.TestDirectory); + while (directory != null && !File.Exists(Path.Combine(directory.FullName, "CultLib.sln"))) + directory = directory.Parent; + return directory?.FullName ?? throw new InvalidOperationException("CultLib.sln was not found above the test directory."); + } + + // Fixed test keys. They sign only the committed vector and prove nothing else. + private const string VectorOdinPrivateKeyPem = @"-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgHY0//QOheSwARzXE +iX/nGqSD7XFAy530QQqKeXPNxMChRANCAASyEksa2ZGtboPztVAq/TFhB6Qsh8SR +43t1VrDCmYgpY4kehsd2lQoIc0sqO06l6q/td/ey+9ygzWbszdnGeeSB +-----END PRIVATE KEY-----"; + + private const string VectorProviderPrivateKeyPem = @"-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgVC+9X4t+1HAiIxP4 +TEuAuBAY+3ryKK8SaitB0TqsPQqhRANCAATpci+DHdbWruUkURXTJht4pY0WCyyr +ngEcG6H2ALBwf6ItRYiq2rni4nPlXpszsdfDDcBurYZmTFFnqjcOrzTp +-----END PRIVATE KEY-----"; + private static CultMeshAuthorityRoute SignedRoute(ECDsa odin, ECDsa provider) => CultMeshAuthorityProof.CreateSignedRoute( "aetheria", From 66286b9dfbfd6f78b4c19c9fc7cc5423fae61c9c Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 15:59:09 +0200 Subject: [PATCH 26/94] Delete the browser copy of the route verifier cultmesh-browser now verifies routes and provider session proofs through cultnet-ts/authority. Its own verifyAuthorityRoute, canonicalRoute, canonicalSession, canonicalFields, verifyP256, isLoopbackEndpoint and the two base64 helpers are gone; the six route and trust types are re-exported under their old Browser names as aliases of the shared types. randomNonce stays: it is client behaviour, not verification. All 17 browser tests pass unchanged. Co-Authored-By: Claude Fable 5.1 --- packages/cultmesh-browser/src/index.ts | 183 +++---------------------- 1 file changed, 20 insertions(+), 163 deletions(-) diff --git a/packages/cultmesh-browser/src/index.ts b/packages/cultmesh-browser/src/index.ts index 4dddfa7d..86d933d1 100644 --- a/packages/cultmesh-browser/src/index.ts +++ b/packages/cultmesh-browser/src/index.ts @@ -15,42 +15,26 @@ import { type CultMeshSessionAcceptedMessage, type CultMeshSessionOpenMessage, } from "cultnet-ts/contracts"; +import { + base64ToBytes, + bytesToBase64, + isLoopbackEndpoint, + verifyAuthorityRoute, + verifyProviderSessionProof, + type CultMeshAuthorityIdentity, + type CultMeshAuthorityRouteCertificate, + type CultMeshAuthorityRouteView, + type CultMeshAuthorityTrustMode, + type CultMeshAuthorityTrustPolicy, + type CultMeshP256PublicKey, +} from "cultnet-ts/authority"; -export interface CultMeshBrowserIdentity { - verseId: string; - authorityRuntimeId: string; -} - -export interface CultMeshBrowserRoute extends CultMeshBrowserIdentity { - endpoint: string; - protocolId?: string; - protocolIds?: readonly string[]; - priority?: number; - generation: string; - certificate?: CultMeshBrowserRouteCertificate; -} - -export interface CultMeshBrowserP256PublicKey { - keyId: string; - x: string; - y: string; -} - -export interface CultMeshBrowserRouteCertificate { - providerKey: CultMeshBrowserP256PublicKey; - odinKeyId: string; - issuedAtUnixMilliseconds: number; - expiresAtUnixMilliseconds: number; - signature: string; -} - -export type CultMeshBrowserAuthorityTrustMode = "authenticated-remote" | "local-development"; - -export interface CultMeshBrowserAuthorityTrustPolicy { - mode: CultMeshBrowserAuthorityTrustMode; - odinRoots?: readonly CultMeshBrowserP256PublicKey[]; - now?: () => number; -} +export type CultMeshBrowserIdentity = CultMeshAuthorityIdentity; +export type CultMeshBrowserRoute = CultMeshAuthorityRouteView; +export type CultMeshBrowserP256PublicKey = CultMeshP256PublicKey; +export type CultMeshBrowserRouteCertificate = CultMeshAuthorityRouteCertificate; +export type CultMeshBrowserAuthorityTrustMode = CultMeshAuthorityTrustMode; +export type CultMeshBrowserAuthorityTrustPolicy = CultMeshAuthorityTrustPolicy; export interface CultMeshBrowserRendezvous { resolve( @@ -794,19 +778,6 @@ export function decodeCultNetOperationPayload(response: CultNetOperationRespo return decode(base64ToBytes(response.payload)) as T; } -function bytesToBase64(bytes: Uint8Array): string { - let binary = ""; - for (let offset = 0; offset < bytes.length; offset += 0x8000) { - binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000)); - } - return btoa(binary); -} - -function base64ToBytes(value: string): Uint8Array { - const binary = atob(value); - return Uint8Array.from(binary, character => character.charCodeAt(0)); -} - function requireWebSocketEndpoint(value: string, field: string): URL { let endpoint: URL; try { @@ -946,131 +917,17 @@ async function validateSessionAcceptance( if (!providerKey || message.providerKeyId !== providerKey.keyId || !message.providerSignature) { return new Error("CultMesh authority did not prove possession of the Odin-certified provider key."); } - if (!await verifyP256(providerKey, canonicalSession(request, route.endpoint), message.providerSignature)) { + if (!await verifyProviderSessionProof(request, route.endpoint, providerKey, message.providerSignature)) { return new Error("CultMesh provider session proof is invalid."); } return undefined; } -async function verifyAuthorityRoute( - route: CultMeshBrowserRoute, - trust: CultMeshBrowserAuthorityTrustPolicy, -): Promise { - const certificate = route.certificate; - if (!certificate) { - if (trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint)) return; - throw new Error("Remote CultMesh routes require an Odin-signed authority certificate."); - } - const endpoint = new URL(route.endpoint); - if (endpoint.protocol !== "wss:" && !(trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint))) { - throw new Error("Authenticated remote CultMesh browser routes require wss:// channel protection."); - } - const now = trust.now?.() ?? Date.now(); - if (now < certificate.issuedAtUnixMilliseconds || now >= certificate.expiresAtUnixMilliseconds) { - throw new Error("The Odin route certificate is not currently valid."); - } - const root = trust.odinRoots?.find(candidate => candidate.keyId === certificate.odinKeyId); - if (!root) throw new Error(`Odin key '${certificate.odinKeyId}' is not trusted by this consumer.`); - if (!await verifyP256(root, canonicalRoute(route), certificate.signature)) { - throw new Error("The Odin route certificate signature is invalid."); - } -} - -function canonicalRoute(route: CultMeshBrowserRoute): Uint8Array { - const certificate = route.certificate!; - return canonicalFields( - "gamecult.cultmesh.route-certificate.v1", - route.verseId, - route.authorityRuntimeId, - route.endpoint, - [...(route.protocolIds ?? [route.protocolId ?? "cultmesh.documents.v1"])].sort().join("\u001f"), - String(route.priority ?? 0), - route.generation, - certificate.providerKey.keyId, - certificate.providerKey.x, - certificate.providerKey.y, - certificate.odinKeyId, - String(certificate.issuedAtUnixMilliseconds), - String(certificate.expiresAtUnixMilliseconds), - ); -} - -function canonicalSession(request: CultMeshSessionOpenMessage, endpoint: string): Uint8Array { - return canonicalFields( - "gamecult.cultmesh.session-proof.v1", - request.clientNonce, - request.messageId, - request.sourceRuntimeId, - request.verseId, - request.authorityRuntimeId, - request.protocolId, - endpoint, - request.routeGeneration, - ); -} - -function canonicalFields(...values: string[]): Uint8Array { - const encoder = new TextEncoder(); - const encoded = values.map(value => encoder.encode(value)); - const total = encoded.reduce((sum, value) => sum + 4 + value.byteLength, 0); - const result = new Uint8Array(total); - const view = new DataView(result.buffer); - let offset = 0; - for (const value of encoded) { - view.setUint32(offset, value.byteLength, false); - offset += 4; - result.set(value, offset); - offset += value.byteLength; - } - return result; -} - -async function verifyP256( - key: CultMeshBrowserP256PublicKey, - payload: Uint8Array, - signatureBase64: string, -): Promise { - try { - const x = base64ToBytes(key.x); - const y = base64ToBytes(key.y); - const signature = base64ToBytes(signatureBase64); - if (x.byteLength !== 32 || y.byteLength !== 32 || signature.byteLength !== 64) return false; - const raw = new Uint8Array(65); - raw[0] = 4; - raw.set(x, 1); - raw.set(y, 33); - const publicKey = await crypto.subtle.importKey( - "raw", - raw.slice().buffer as ArrayBuffer, - { name: "ECDSA", namedCurve: "P-256" }, - false, - ["verify"], - ); - return await crypto.subtle.verify( - { name: "ECDSA", hash: "SHA-256" }, - publicKey, - signature.slice().buffer as ArrayBuffer, - payload.slice().buffer as ArrayBuffer, - ); - } catch { - return false; - } -} - function randomNonce(): string { const bytes = crypto.getRandomValues(new Uint8Array(32)); return bytesToBase64(bytes); } -function isLoopbackEndpoint(value: string): boolean { - try { - const host = new URL(value).hostname.replace(/^\[|\]$/g, "").toLowerCase(); - return host === "localhost" || host === "127.0.0.1" || host === "::1"; - } catch { - return false; - } -} - function requireText(value: string, field: string): void { if (!value || value.trim().length === 0) throw new Error(`CultMesh browser ${field} is required.`); } From 062a5c66787090fab3a4c6b6d58574603889e398 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 15:59:09 +0200 Subject: [PATCH 27/94] Add a mutation check for the shared route verifier One mutation per rule the cut map names, applied to the source bytes and restored from the original bytes with a digest check; a no-op control runs first through the same write path. A survivor is a rule no test pins and fails the script. Co-Authored-By: Claude Fable 5.1 --- scripts/mutate-cultmesh-authority.mjs | 148 ++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 scripts/mutate-cultmesh-authority.mjs diff --git a/scripts/mutate-cultmesh-authority.mjs b/scripts/mutate-cultmesh-authority.mjs new file mode 100644 index 00000000..a8d705f7 --- /dev/null +++ b/scripts/mutate-cultmesh-authority.mjs @@ -0,0 +1,148 @@ +// Mutation check for the shared CultMesh route verifier. +// +// Each rule the cut map names for `packages/cultnet-ts/src/cultmesh-authority.ts` +// gets one mutation. A mutation is killed when `npm run test --workspace +// packages/cultnet-ts` fails with it applied; a survivor means no test pins that +// rule. The file is rewritten as UTF-8 bytes and restored from the original +// bytes with a digest check, never from git. A no-op control runs first through +// the same write path so a false kill from the write itself cannot hide. +// +// node scripts/mutate-cultmesh-authority.mjs + +import { createHash } from "node:crypto"; +import { execFileSync } from "node:child_process"; +import { readFileSync, writeFileSync } from "node:fs"; +import { dirname, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const target = join(repoRoot, "packages", "cultnet-ts", "src", "cultmesh-authority.ts"); +const npmCli = process.env.npm_execpath ?? + join(dirname(process.execPath), "node_modules", "npm", "bin", "npm-cli.js"); + +const mutations = [ + { + rule: "unsigned remote route is refused", + old: 'throw new Error("Remote CultMesh routes require an Odin-signed authority certificate.");', + new: "return;", + }, + { + rule: "unsigned loopback is accepted only under local-development", + old: 'if (trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint)) return;', + new: "if (isLoopbackEndpoint(route.endpoint)) return;", + }, + { + rule: "protected-scheme gate", + old: "if (!isProtectedEndpoint(route.endpoint) && !(", + new: "if (isProtectedEndpoint(route.endpoint) && !(", + }, + { + rule: "validity window (expiresAt exclusive)", + old: "now >= certificate.expiresAtUnixMilliseconds", + new: "now > certificate.expiresAtUnixMilliseconds", + }, + { + rule: "Odin root lookup by key id", + old: "candidate => candidate.keyId === certificate.odinKeyId", + new: "candidate => true", + }, + { + rule: "route transcript field order", + old: " route.verseId,\n route.authorityRuntimeId,\n", + new: " route.authorityRuntimeId,\n route.verseId,\n", + }, + { + rule: "session transcript binds the nonce", + old: " request.clientNonce,\n", + new: "", + }, + { + rule: "length-prefix framing is big-endian", + old: "view.setUint32(offset, value.byteLength, false);", + new: "view.setUint32(offset, value.byteLength, true);", + }, + { + rule: "P-256 verification hashes with SHA-256", + old: '{ name: "ECDSA", hash: "SHA-256" },', + new: '{ name: "ECDSA", hash: "SHA-384" },', + }, + // Not listed: removing `signature.byteLength !== 64` from verifyP256. WebCrypto + // refuses a non-64-byte P1363 signature on its own, so that guard has no + // observable behaviour and the mutant is equivalent (it survived when tried). + { + rule: "loopback recognises ::1", + old: 'host === "::1"', + new: 'host === "::2"', + }, + { + rule: "protected scheme: any scheme containing quic", + old: 'scheme.includes("quic")', + new: 'scheme === "quic"', + }, + { + rule: "protected scheme: https", + old: 'scheme === "https" || ', + new: "", + }, +]; + +const original = readFileSync(target); +const originalText = original.toString("utf8"); +const originalDigest = digest(original); + +function digest(bytes) { + return createHash("sha256").update(bytes).digest("hex"); +} + +function testsPass() { + try { + execFileSync(process.execPath, [npmCli, "run", "test", "--workspace", "packages/cultnet-ts"], { + cwd: repoRoot, + stdio: ["ignore", "pipe", "pipe"], + }); + return true; + } catch { + return false; + } +} + +function restore() { + writeFileSync(target, original); + const restored = digest(readFileSync(target)); + if (restored !== originalDigest) { + throw new Error(`restore failed: ${target} digest ${restored} != ${originalDigest}`); + } +} + +function occurrences(text, needle) { + return text.split(needle).length - 1; +} + +const results = []; +let failed = false; + +try { + writeFileSync(target, Buffer.from(originalText, "utf8")); + const controlPass = testsPass(); + results.push({ rule: "control (no-op rewrite)", outcome: controlPass ? "green" : "RED" }); + if (!controlPass) failed = true; + else { + for (const mutation of mutations) { + const count = occurrences(originalText, mutation.old); + if (count !== 1) { + throw new Error(`anchor for '${mutation.rule}' matched ${count} times, expected exactly 1`); + } + writeFileSync(target, Buffer.from(originalText.replace(mutation.old, mutation.new), "utf8")); + const pass = testsPass(); + restore(); + results.push({ rule: mutation.rule, outcome: pass ? "SURVIVED" : "killed" }); + if (pass) failed = true; + } + } +} finally { + restore(); +} + +for (const result of results) console.log(`${result.outcome.padEnd(9)} ${result.rule}`); +console.log(`restored ${target} sha256=${originalDigest}`); +process.exit(failed ? 1 : 0); From 737e13286b87fc8076b4277fc4632618e4136cb2 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 16:01:46 +0200 Subject: [PATCH 28/94] Record Cut 1's landing One route verifier in cultnet-ts, the browser copy deleted, a C#-written vector file, and a mutation runner with a control. Soul is on it. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index c0f6f6a4..04c97e14 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -11,7 +11,9 @@ campaign, registry publication parked for a later pass by choice. Cut 6, section 5.4, the binary-resolution and dependency lines of Cut 4, and Cut 7's ledger are remapped under C (landed 2026-09-16, same day). Q8 is ruled: the built binaries are committed to the tree (section 11.2). No operator -question is open. Cut 1 is in Hands. +question is open. **Cut 1 landed** at `e234a64` (shared verifier, tests, +C#-written vectors), `66286b9` (browser copy deleted, −143 net) and +`062a5c6` (mutation runner; twelve killed, one equivalent). Soul in flight. Anchor: repo `F:\Projects\CultLib`, branch `main`, HEAD `8d8ad568aa280bac34bf123503a9e38c175eb558`. The three commits since the From c00bed85758e12a9b242c2a38112e46acad5d6e0 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 16:19:46 +0200 Subject: [PATCH 29/94] Record Soul's Cut 1 pass The verifier is sound in both directions, the second one by probe. What can go wrong silently is the verification story: a mutant left compiled in an ignored directory, a C# vector check with no CI owner, a public function that reads a pooled buffer wrong, and four edge rules that drift from the reference. One map claim about error texts is withdrawn. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 45 ++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index 04c97e14..b584b409 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -13,7 +13,43 @@ ledger are remapped under C (landed 2026-09-16, same day). Q8 is ruled: the built binaries are committed to the tree (section 11.2). No operator question is open. **Cut 1 landed** at `e234a64` (shared verifier, tests, C#-written vectors), `66286b9` (browser copy deleted, −143 net) and -`062a5c6` (mutation runner; twelve killed, one equivalent). Soul in flight. +`062a5c6` (mutation runner; twelve killed, one equivalent). Soul's pass +found the verifier and the C#-to-TypeScript bridge sound and proved the +other direction by probe; a fix batch is in Hands for the six findings below. + +**Cut 1 Soul findings, 2026-09-16.** Held: every test count, both negative +greps, all twelve mutations rerun and killed, the control catching a +truncated write, the equivalent mutant confirmed (Node 24 WebCrypto refuses +every non-64-byte P1363 signature tried, across forty keys), the separator +byte matching C#, and the TypeScript-signs-C#-verifies direction proven by +a probe over adversarial inputs, which nothing in the repo yet pins. Found: + +- **The mutation runner leaves the last mutant compiled in `dist/`**, which + is git-ignored, and the browser tests then pass against it. A stale asset + impersonating logic, the doctrine's own trap. Medium. +- **The C# half of the vector check never runs in CI.** The only `dotnet + test` of that project is filtered to one lease test; a C# transcript + change would leave the committed vector self-consistent and nothing red. + Medium. +- **`verifyP256` fails closed on Node `Buffer` inputs**: `.slice().buffer` + on a pooled buffer is the whole pool. Internal callers allocate their own + bytes, so it is safe today and wrong for the Cut 4 consumer. Medium. +- **The `protocolIds` sort is untested**: the vector's ids were written + sorted, so removing the sort survives. Low-medium. +- **Four edge divergences from the C# rules**: an empty signature is + "unsigned" in C# and "invalid" in TypeScript; C#'s loopback set is wider + (`127.0.0.2`, and the TypeScript test pinned the narrower answer); root + lookup and validity window check in opposite orders; duplicate root key + ids throw in C# and take-first in TypeScript. All aligned to C# in the fix + batch. +- **The negative grep pins names, not structure**: a local shim under + another name passed every browser test and both greps. A guard-strength + note, recorded. +- **A killed runner leaves the mutant in the tree**; a sidecar restore is + added, as Epiphany's harness has. +- **`cultmesh-ts` resolves modules with `moduleResolution: "Node"`**, which + ignores `exports`, so `cultnet-ts/authority` is unresolvable from that + package until Cut 4 changes it; the root re-export covers it today. Anchor: repo `F:\Projects\CultLib`, branch `main`, HEAD `8d8ad568aa280bac34bf123503a9e38c175eb558`. The three commits since the @@ -367,8 +403,11 @@ Sizing consequences: - Inputs: a route view (Verse, authority runtime, endpoint, protocol ids, priority, generation, certificate), a trust policy (`mode`, `odinRoots`, `now`), a session-open request and an accepted message. -- Outputs: resolution or a thrown `Error` with the same message texts the - browser package emits today (its tests pin them). +- Outputs: resolution or a thrown `Error` whose message is the C# reference's + for the same refusal. *(First written as "the same message texts the + browser package emits today (its tests pin them)"; Soul found the browser + tests pin two messages only, and the channel-protection text was false for + QUIC. Corrected 2026-09-16.)* - Derived state: none. - Forbidden writers: `cultmesh-browser` must not retain or regrow `verifyAuthorityRoute`, `canonicalRoute`, `canonicalSession`, From c2ffc32ff6d559384fcf1a56253dcd1226633fbe Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 16:24:41 +0200 Subject: [PATCH 30/94] Make the TypeScript route verifier the C# rules exactly verifyP256 handed WebCrypto `view.slice().buffer`. For a Node Buffer, `slice` is `subarray`, so `.buffer` is the shared pool: a pooled Buffer or a subarray of a larger allocation verified false while the same bytes as a plain Uint8Array verified true. Copy exactly the viewed bytes. Trust rules that had drifted from `CultMeshAuthorityProof.cs`: - A certificate whose signature is empty or whitespace is an unsigned route (C# `Verify` line 120): local-development loopback accepts it, everything else refuses with the unsigned message. - Loopback is `System.Uri.IsLoopback`: any 127.0.0.0/8 host, `::1`, the IPv4-mapped `::ffff:127.0.0.1` (only `.1`), and the host names `localhost` and `loopback`. WHATWG URL normalises `127.1`, `0x7f000001` and `2130706433` the way System.Uri does. Probed on the C# side through the public policy before the rule was written; the test pins that set. - The root lookup runs before the validity window, so an expired route under an unknown root is refused as untrusted on both sides. - A policy listing one Odin key id twice is refused at first use, the closest a plain object gets to the C# constructor throwing. One test per rule, one mutation per rule in the runner's list. A fixture whose protocol ids are unsorted and whose expected transcript is the sorted one means removing the sort is now killed. The runner now matches anchors in the file's own line ending. On an autocrlf checkout the two multi-line anchors it already had ("route transcript field order", "session transcript binds the nonce") matched nothing, so the run threw at those entries instead of testing them. Co-Authored-By: Claude Fable 5.1 --- packages/cultnet-ts/src/cultmesh-authority.ts | 53 +++++++-- .../test/cultmesh-authority.test.ts | 101 +++++++++++++++++- scripts/mutate-cultmesh-authority.mjs | 64 ++++++++++- 3 files changed, 203 insertions(+), 15 deletions(-) diff --git a/packages/cultnet-ts/src/cultmesh-authority.ts b/packages/cultnet-ts/src/cultmesh-authority.ts index c579f347..fd0fcce6 100644 --- a/packages/cultnet-ts/src/cultmesh-authority.ts +++ b/packages/cultnet-ts/src/cultmesh-authority.ts @@ -44,29 +44,49 @@ export interface CultMeshAuthorityTrustPolicy { now?: () => number; } +// Rule for rule, this is `CultMeshAuthorityTrustPolicy.Verify` in the C# +// reference, in the same order: unsigned, channel protection, root lookup, +// validity window, signature. The same input yields the same refusal on both +// sides. A certificate whose signature is empty or whitespace is unsigned +// (`CultMeshRouteCertificate` trims the signature; `Verify` treats a +// whitespace signature as no certificate). export async function verifyAuthorityRoute( route: CultMeshAuthorityRouteView, trust: CultMeshAuthorityTrustPolicy, ): Promise { + const roots = trustedOdinRoots(trust); const certificate = route.certificate; - if (!certificate) { + const signature = certificate?.signature.trim() ?? ""; + if (!certificate || signature === "") { if (trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint)) return; throw new Error("Remote CultMesh routes require an Odin-signed authority certificate."); } if (!isProtectedEndpoint(route.endpoint) && !(trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint))) { throw new Error("Authenticated remote CultMesh routes require TLS or QUIC channel protection."); } + const root = roots.get(certificate.odinKeyId); + if (!root) throw new Error(`Odin key '${certificate.odinKeyId}' is not trusted by this consumer.`); const now = trust.now?.() ?? Date.now(); if (now < certificate.issuedAtUnixMilliseconds || now >= certificate.expiresAtUnixMilliseconds) { throw new Error("The Odin route certificate is not currently valid."); } - const root = trust.odinRoots?.find(candidate => candidate.keyId === certificate.odinKeyId); - if (!root) throw new Error(`Odin key '${certificate.odinKeyId}' is not trusted by this consumer.`); - if (!await verifyP256(root, canonicalRoute(route), certificate.signature)) { + if (!await verifyP256(root, canonicalRoute(route), signature)) { throw new Error("The Odin route certificate signature is invalid."); } } +// The C# policy is a dictionary keyed by Odin key id and its constructor +// throws on a duplicate. A TypeScript policy is a plain object, so the same +// refusal happens at the first use of the policy, before any route is judged. +function trustedOdinRoots(trust: CultMeshAuthorityTrustPolicy): Map { + const roots = new Map(); + for (const root of trust.odinRoots ?? []) { + if (roots.has(root.keyId)) throw new Error(`Odin root key id '${root.keyId}' is listed more than once in the trust policy.`); + roots.set(root.keyId, root); + } + return roots; +} + /** Verifies the provider's session proof over the accepted handshake. */ export function verifyProviderSessionProof( request: CultMeshSessionOpenMessage, @@ -142,7 +162,7 @@ export async function verifyP256( raw.set(y, 33); const publicKey = await crypto.subtle.importKey( "raw", - raw.slice().buffer as ArrayBuffer, + ownedBytes(raw), { name: "ECDSA", namedCurve: "P-256" }, false, ["verify"], @@ -150,18 +170,35 @@ export async function verifyP256( return await crypto.subtle.verify( { name: "ECDSA", hash: "SHA-256" }, publicKey, - signature.slice().buffer as ArrayBuffer, - payload.slice().buffer as ArrayBuffer, + ownedBytes(signature), + ownedBytes(payload), ); } catch { return false; } } +// WebCrypto reads an `ArrayBuffer` whole. A view's `.buffer` is not the view: +// a Node `Buffer` (a subarray of a shared pool) or any offset `Uint8Array` +// would hand WebCrypto the pool, and `Buffer.prototype.slice` does not copy. +// Copy exactly the viewed bytes so every view verifies alike. +function ownedBytes(view: Uint8Array): ArrayBuffer { + return view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength) as ArrayBuffer; +} + +/** + * The C# rule (`CultMeshAuthorityProof.cs`, `IsLoopback`): `System.Uri.IsLoopback`, + * which is any `127.0.0.0/8` IPv4 host, `::1`, the IPv4-mapped `::ffff:127.0.0.1` + * (and only `.1`), and the host names `localhost` and `loopback`, case-insensitively. + * WHATWG `URL` already normalises `127.1`, `0x7f000001` and `2130706433` to + * `127.0.0.1` and serialises the mapped form as `::ffff:7f00:1`, as `System.Uri` + * does on its side. `localhost.` is not loopback on either side. + */ export function isLoopbackEndpoint(value: string): boolean { try { const host = new URL(value).hostname.replace(/^\[|\]$/g, "").toLowerCase(); - return host === "localhost" || host === "127.0.0.1" || host === "::1"; + return host === "localhost" || host === "loopback" || host === "::1" || host === "::ffff:7f00:1" || + /^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(host); } catch { return false; } diff --git a/packages/cultnet-ts/test/cultmesh-authority.test.ts b/packages/cultnet-ts/test/cultmesh-authority.test.ts index cb3a62da..03a9b9f0 100644 --- a/packages/cultnet-ts/test/cultmesh-authority.test.ts +++ b/packages/cultnet-ts/test/cultmesh-authority.test.ts @@ -17,6 +17,7 @@ import type { CultMeshSessionOpenMessage } from "../src/contracts"; import { base64ToBytes, bytesToBase64, + canonicalFields, canonicalRoute, canonicalSession, isLoopbackEndpoint, @@ -120,6 +121,22 @@ test("an unsigned loopback route is accepted only under local-development", asyn await assert.rejects(verifyAuthorityRoute(unsigned, { mode: "authenticated-remote" }), /Odin-signed authority certificate/); }); +test("a certificate whose signature is empty or whitespace is an unsigned route, as in C#", async () => { + for (const signature of ["", " ", "\n\t "]) { + const remote = signedRoute(); + const remoteBlank = { ...remote.route, certificate: { ...remote.route.certificate!, signature } }; + await assert.rejects(verifyAuthorityRoute(remoteBlank, remoteTrust(remote.odin.publicKey)), /Odin-signed authority certificate/); + await assert.rejects( + verifyAuthorityRoute(remoteBlank, { ...remoteTrust(remote.odin.publicKey), mode: "local-development" }), + /Odin-signed authority certificate/, + ); + const loopback = signedRoute("ws://127.0.0.1:4050/mesh"); + const loopbackBlank = { ...loopback.route, certificate: { ...loopback.route.certificate!, signature } }; + await verifyAuthorityRoute(loopbackBlank, { ...remoteTrust(loopback.odin.publicKey), mode: "local-development" }); + await assert.rejects(verifyAuthorityRoute(loopbackBlank, remoteTrust(loopback.odin.publicKey)), /Odin-signed authority certificate/); + } +}); + test("a certified route on an unprotected scheme is refused unless it is loopback under local-development", async () => { const remote = signedRoute("ws://provider.example/mesh"); await assert.rejects(verifyAuthorityRoute(remote.route, remoteTrust(remote.odin.publicKey)), /channel protection/); @@ -154,6 +171,31 @@ test("an Odin root the consumer does not trust is refused before any signature c await assert.rejects(verifyAuthorityRoute(route, remoteTrust(stranger.publicKey)), /signature is invalid/); }); +test("the root lookup precedes the validity window, so an expired route under an unknown root is refused as untrusted (C# order)", async () => { + const { route, odin } = signedRoute(); + const expired = route.certificate!.expiresAtUnixMilliseconds + 1; + await assert.rejects(verifyAuthorityRoute(route, remoteTrust(odin.publicKey, expired)), /not currently valid/); + await assert.rejects( + verifyAuthorityRoute(route, { mode: "authenticated-remote", odinRoots: [{ ...odin.publicKey, keyId: "other-root" }], now: () => expired }), + /is not trusted/, + ); +}); + +test("a trust policy listing one Odin key id twice is refused before any route is judged, as the C# constructor throws", async () => { + const { route, odin } = signedRoute(); + const twin = { ...keyPair("odin-root-1").publicKey }; + for (const odinRoots of [[odin.publicKey, twin], [twin, odin.publicKey], [odin.publicKey, odin.publicKey]]) { + await assert.rejects( + verifyAuthorityRoute(route, { mode: "authenticated-remote", odinRoots, now: () => NOW }), + /'odin-root-1' is listed more than once/, + ); + } + await assert.rejects( + verifyAuthorityRoute({ ...route, endpoint: "ws://127.0.0.1:4050/mesh", certificate: undefined }, { mode: "local-development", odinRoots: [twin, twin] }), + /listed more than once/, + ); +}); + test("a mutated endpoint invalidates the Odin signature", async () => { const { route, odin } = signedRoute(); await assert.rejects( @@ -177,6 +219,50 @@ test("a signature that is not 64 P1363 bytes is refused", async () => { assert.equal(await verifyP256(odin.publicKey, canonicalRoute(route), "not base64!"), false); }); +test("verifyP256 reads exactly the viewed bytes: a Uint8Array, a pooled Buffer and a subarray of a large allocation verify alike", async () => { + const { route, odin } = signedRoute(); + const payload = canonicalRoute(route); + const signature = route.certificate!.signature; + const pooled = Buffer.from(payload); + const large = Buffer.alloc(16 * 1024, 0xa5); + const subarray = large.subarray(1000, 1000 + payload.byteLength); + subarray.set(payload); + const offsetView = new Uint8Array(new ArrayBuffer(payload.byteLength + 64), 32, payload.byteLength); + offsetView.set(payload); + for (const view of [payload, pooled, subarray, offsetView]) { + assert.equal(await verifyP256(odin.publicKey, view, signature), true, `${view.constructor.name} byteOffset=${view.byteOffset}`); + } + const signatureBytes = base64ToBytes(signature); + const sigLarge = Buffer.alloc(16 * 1024, 0x5a); + sigLarge.set(signatureBytes, 4000); + const sigView = sigLarge.subarray(4000, 4064); + assert.equal(await verifyP256(odin.publicKey, payload, bytesToBase64(sigView)), true); + assert.equal(await verifyP256(odin.publicKey, Buffer.from(payload.subarray(1)), signature), false); +}); + +test("protocol ids are sorted ordinally into the transcript, whatever order the route lists them in", () => { + const { route } = signedRoute(); + const unsorted = { ...route, protocolIds: ["cultmesh.realtime.v1", "cultmesh.content.v1", "cultmesh.documents.v1"] }; + const certificate = route.certificate!; + const expected = canonicalFields( + "gamecult.cultmesh.route-certificate.v1", + route.verseId, + route.authorityRuntimeId, + route.endpoint, + "cultmesh.content.v1cultmesh.documents.v1cultmesh.realtime.v1", + "0", + route.generation, + certificate.providerKey.keyId, + certificate.providerKey.x, + certificate.providerKey.y, + certificate.odinKeyId, + String(certificate.issuedAtUnixMilliseconds), + String(certificate.expiresAtUnixMilliseconds), + ); + assert.deepEqual(canonicalRoute(unsorted), expected); + assert.deepEqual(canonicalRoute({ ...unsorted, protocolIds: [...unsorted.protocolIds!].reverse() }), expected); +}); + test("the provider session proof binds the nonce, the endpoint and the certified key", async () => { const { route, provider } = signedRoute(); const open = request(); @@ -196,11 +282,20 @@ test("isProtectedEndpoint is the C# rule: wss, https, or any scheme containing q } }); -test("isLoopbackEndpoint recognises localhost, 127.0.0.1 and ::1 only", () => { - for (const loopback of ["ws://localhost:4050/mesh", "ws://127.0.0.1:4050/mesh", "ws://[::1]:4050/mesh", "wss://LOCALHOST/mesh"]) { +// The accepted and refused hosts here are what `System.Uri.IsLoopback` answered +// through `CultMeshAuthorityTrustPolicy` on 2026-09-16; keep them in step. +test("isLoopbackEndpoint is the C# System.Uri.IsLoopback set", () => { + for (const loopback of [ + "ws://localhost:4050/mesh", "wss://LOCALHOST/mesh", "ws://loopback:4050/mesh", "ws://LoopBack:4050/mesh", + "ws://127.0.0.1:4050/mesh", "ws://127.0.0.2/mesh", "ws://127.255.255.254/mesh", "ws://127.1/mesh", "ws://0x7f000001/mesh", "ws://2130706433/mesh", + "ws://[::1]:4050/mesh", "ws://[0:0:0:0:0:0:0:1]:4050/mesh", "ws://[::ffff:127.0.0.1]/mesh", "ws://[::ffff:7f00:1]/mesh", + ]) { assert.equal(isLoopbackEndpoint(loopback), true, loopback); } - for (const remote of ["ws://192.0.2.10:4050/mesh", "wss://provider.example/mesh", "ws://127.0.0.2/mesh", "not a url"]) { + for (const remote of [ + "ws://192.0.2.10:4050/mesh", "wss://provider.example/mesh", "ws://[::ffff:127.0.0.2]/mesh", "ws://localhost./mesh", + "ws://localhost.localdomain/mesh", "ws://127.example/mesh", "ws://0.0.0.0/mesh", "ws://[::]/mesh", "not a url", + ]) { assert.equal(isLoopbackEndpoint(remote), false, remote); } }); diff --git a/scripts/mutate-cultmesh-authority.mjs b/scripts/mutate-cultmesh-authority.mjs index a8d705f7..3e093414 100644 --- a/scripts/mutate-cultmesh-authority.mjs +++ b/scripts/mutate-cultmesh-authority.mjs @@ -43,8 +43,43 @@ const mutations = [ }, { rule: "Odin root lookup by key id", - old: "candidate => candidate.keyId === certificate.odinKeyId", - new: "candidate => true", + old: "const root = roots.get(certificate.odinKeyId);", + new: "const root = [...roots.values()][0];", + }, + { + rule: "empty or whitespace signature is an unsigned route", + old: 'if (!certificate || signature === "") {', + new: "if (!certificate) {", + }, + { + rule: "root lookup precedes the validity window", + old: " const root = roots.get(certificate.odinKeyId);\n" + + " if (!root) throw new Error(`Odin key '${certificate.odinKeyId}' is not trusted by this consumer.`);\n" + + " const now = trust.now?.() ?? Date.now();\n" + + " if (now < certificate.issuedAtUnixMilliseconds || now >= certificate.expiresAtUnixMilliseconds) {\n" + + ' throw new Error("The Odin route certificate is not currently valid.");\n' + + " }\n", + new: " const now = trust.now?.() ?? Date.now();\n" + + " if (now < certificate.issuedAtUnixMilliseconds || now >= certificate.expiresAtUnixMilliseconds) {\n" + + ' throw new Error("The Odin route certificate is not currently valid.");\n' + + " }\n" + + " const root = roots.get(certificate.odinKeyId);\n" + + " if (!root) throw new Error(`Odin key '${certificate.odinKeyId}' is not trusted by this consumer.`);\n", + }, + { + rule: "duplicate Odin root key ids refuse the policy", + old: " if (roots.has(root.keyId)) throw new Error(`Odin root key id '${root.keyId}' is listed more than once in the trust policy.`);\n", + new: "", + }, + { + rule: "protocol ids are sorted into the transcript", + old: "].sort().join(", + new: "].join(", + }, + { + rule: "verifyP256 copies the viewed payload bytes, not the pool behind a Buffer", + old: " ownedBytes(payload),", + new: " payload.slice().buffer as ArrayBuffer,", }, { rule: "route transcript field order", @@ -74,6 +109,21 @@ const mutations = [ old: 'host === "::1"', new: 'host === "::2"', }, + { + rule: "loopback is all of 127.0.0.0/8", + old: "/^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(host)", + new: 'host === "127.0.0.1"', + }, + { + rule: "loopback recognises the host name loopback", + old: 'host === "loopback" || ', + new: "", + }, + { + rule: "loopback recognises the IPv4-mapped ::ffff:127.0.0.1", + old: 'host === "::ffff:7f00:1" ||', + new: "", + }, { rule: "protected scheme: any scheme containing quic", old: 'scheme.includes("quic")', @@ -90,6 +140,11 @@ const original = readFileSync(target); const originalText = original.toString("utf8"); const originalDigest = digest(original); +// Anchors are written with "\n"; the checkout may be CRLF (autocrlf). Match +// the file's own line ending so a multi-line anchor cannot silently miss. +const eol = originalText.includes("\r\n") ? "\r\n" : "\n"; +const withEol = text => text.replace(/\r?\n/g, eol); + function digest(bytes) { return createHash("sha256").update(bytes).digest("hex"); } @@ -128,11 +183,12 @@ try { if (!controlPass) failed = true; else { for (const mutation of mutations) { - const count = occurrences(originalText, mutation.old); + const [old, replacement] = [withEol(mutation.old), withEol(mutation.new)]; + const count = occurrences(originalText, old); if (count !== 1) { throw new Error(`anchor for '${mutation.rule}' matched ${count} times, expected exactly 1`); } - writeFileSync(target, Buffer.from(originalText.replace(mutation.old, mutation.new), "utf8")); + writeFileSync(target, Buffer.from(originalText.replace(old, replacement), "utf8")); const pass = testsPass(); restore(); results.push({ rule: mutation.rule, outcome: pass ? "SURVIVED" : "killed" }); From 1590145a81d68b8b940e0da2bb0d2962b1506cec Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 16:27:06 +0200 Subject: [PATCH 31/94] Pin the TypeScript-signed direction of the authority parity check `contracts/cultmesh/authority-route-vectors.json` proves C# bytes verify in TypeScript. Nothing in the repo proved the reverse; Soul's probe did it once in a scratch directory. It is now a committed check in the same shape, mirrored: - `scripts/sign-cultmesh-authority-vectors.mjs` builds the route and session transcripts with the shared module, signs them with fixed TypeScript-owned test keys over awkward inputs (a quic scheme with a query, three unsorted protocol ids, non-ASCII generation text, priority 13), self-verifies, and writes `contracts/cultmesh/authority-route-vectors.ts-signed.json`. - `CultMeshAuthorityProofTests.AuthorityRouteVectorsSignedByTypeScriptVerifyHere` reads that file with keys taken from the file, asserts the protocol ids are unsorted, that `Validate` and `VerifySessionProof` accept, and that a priority-tampered route and a replayed nonce are refused. - The TypeScript vector test runs over both files, so a transcript change on the TypeScript side fails here before C# could trust a stale file. Checked negatively: one base64 character changed in the committed signature fails the C# test. Co-Authored-By: Claude Fable 5.1 --- .../authority-route-vectors.ts-signed.json | 45 ++++++++ .../test/cultmesh-authority.test.ts | 12 +- scripts/sign-cultmesh-authority-vectors.mjs | 109 ++++++++++++++++++ .../CultMeshAuthorityProofTests.cs | 78 +++++++++++++ 4 files changed, 241 insertions(+), 3 deletions(-) create mode 100644 contracts/cultmesh/authority-route-vectors.ts-signed.json create mode 100644 scripts/sign-cultmesh-authority-vectors.mjs diff --git a/contracts/cultmesh/authority-route-vectors.ts-signed.json b/contracts/cultmesh/authority-route-vectors.ts-signed.json new file mode 100644 index 00000000..726731ce --- /dev/null +++ b/contracts/cultmesh/authority-route-vectors.ts-signed.json @@ -0,0 +1,45 @@ +{ + "nowUnixMilliseconds": 1800000000000, + "odinRoot": { + "keyId": "odin-ts-vector", + "x": "lqw9TE0EyuDU5Ghe8SafIbBBYkhHMUF7HXJQUc0nXsw=", + "y": "nUj+Xhakih97JiJcTUNMHM9JIo7MVQaauuAkCXph+tw=" + }, + "route": { + "verseId": "aetheria", + "authorityRuntimeId": "aetheria-daemon", + "endpoint": "cultmesh-state+quic://provider.example:4433/?cert-sha256=ABCDEF", + "protocolIds": [ + "cultmesh.documents.v1", + "cultmesh.content.v1", + "cultmesh.realtime.v1" + ], + "priority": 13, + "generation": "ts-generation-ünïcode-∞-1", + "certificate": { + "providerKey": { + "keyId": "provider-ts-vector", + "x": "JKyjtWnoE5fhSWbeqr188SbReQWCjssf5mSMEa5pV+E=", + "y": "vtduzojDpbT49sbxBSsBQ+f3PG3rm+CUk/MTy2MM/ws=" + }, + "odinKeyId": "odin-ts-vector", + "issuedAtUnixMilliseconds": 1799999940000, + "expiresAtUnixMilliseconds": 1800003600000, + "signature": "NS5a7X8fNqTi1CdpPAcJaMmEsozwFRoygTW4z+JlhHFq7uaZcb4G7NwoEpPqo/Fv+UA7pNl5N+qUMuSD/oAq1Q==" + } + }, + "sessionProof": { + "request": { + "schemaVersion": "cultmesh.session_open.v2", + "messageId": "ts-vector-message-1", + "sourceRuntimeId": "ts-vector-consumer", + "verseId": "aetheria", + "authorityRuntimeId": "aetheria-daemon", + "protocolId": "cultmesh.documents.v1", + "routeGeneration": "ts-generation-ünïcode-∞-1", + "clientNonce": "HICtAmV++1MarssY04Tkyn1j9qVEcOMp/P5Ce1M0Yec=" + }, + "providerKeyId": "provider-ts-vector", + "providerSignature": "OgJHkmw3fhPRS5TXxZm94yZvkWAV5TPDuvG+/zIVlnU7OFENZ0Nn0Pdx0IT/vDfEWXD+8/+sCZVFIFwa4tUjsg==" + } +} diff --git a/packages/cultnet-ts/test/cultmesh-authority.test.ts b/packages/cultnet-ts/test/cultmesh-authority.test.ts index 03a9b9f0..5cd47245 100644 --- a/packages/cultnet-ts/test/cultmesh-authority.test.ts +++ b/packages/cultnet-ts/test/cultmesh-authority.test.ts @@ -30,7 +30,13 @@ import { } from "../src/cultmesh-authority"; const NOW = 1_800_000_000_000; -const VECTORS_PATH = join(__dirname, "..", "..", "..", "..", "contracts", "cultmesh", "authority-route-vectors.json"); +const CONTRACTS = join(__dirname, "..", "..", "..", "..", "contracts", "cultmesh"); +// Written by the C# reference (`CultMeshAuthorityProofTests.AuthorityRouteVectorsAreSharedWithTypeScript`). +const VECTORS_PATH = join(CONTRACTS, "authority-route-vectors.json"); +// Written by `scripts/sign-cultmesh-authority-vectors.mjs` and verified by the +// C# reference; checked here too so a transcript change on this side cannot +// leave a stale TypeScript-signed file behind for C# to trust. +const TS_SIGNED_VECTORS_PATH = join(CONTRACTS, "authority-route-vectors.ts-signed.json"); interface Vectors { nowUnixMilliseconds: number; @@ -305,8 +311,8 @@ test("base64 helpers round-trip across the 32 KiB chunk boundary", () => { assert.deepEqual(base64ToBytes(bytesToBase64(bytes)), bytes); }); -test("the C# reference vectors verify through the shared module", async () => { - const vectors = JSON.parse(readFileSync(VECTORS_PATH, "utf8")) as Vectors; +for (const [label, path] of [["C# reference", VECTORS_PATH], ["TypeScript-signed", TS_SIGNED_VECTORS_PATH]] as const) test(`the ${label} vectors verify through the shared module`, async () => { + const vectors = JSON.parse(readFileSync(path, "utf8")) as Vectors; const trust = { mode: "authenticated-remote" as const, odinRoots: [vectors.odinRoot], now: () => vectors.nowUnixMilliseconds }; await verifyAuthorityRoute(vectors.route, trust); await assert.rejects(verifyAuthorityRoute({ ...vectors.route, priority: 8 }, trust), /signature is invalid/); diff --git a/scripts/sign-cultmesh-authority-vectors.mjs b/scripts/sign-cultmesh-authority-vectors.mjs new file mode 100644 index 00000000..dd68e2b2 --- /dev/null +++ b/scripts/sign-cultmesh-authority-vectors.mjs @@ -0,0 +1,109 @@ +// The TypeScript -> C# direction of the CultMesh authority parity check. +// +// `contracts/cultmesh/authority-route-vectors.json` is written by the C# +// reference and verified by TypeScript. This script writes the mirror file, +// `contracts/cultmesh/authority-route-vectors.ts-signed.json`: TypeScript +// builds the route and session transcripts with the shared module +// (`packages/cultnet-ts/src/cultmesh-authority.ts`), signs them with fixed +// TypeScript-owned test keys, and the C# test +// `CultMeshAuthorityProofTests.AuthorityRouteVectorsSignedByTypeScriptVerifyHere` +// verifies the committed file with the reference implementation only. +// +// The inputs are deliberately awkward: a quic scheme with a query, three +// unsorted protocol ids, non-ASCII generation text, a non-default priority. +// +// npm run build --workspace packages/cultnet-ts +// node scripts/sign-cultmesh-authority-vectors.mjs +// +// Rewrite the file only when the transcript rules change; ECDSA signatures are +// randomised, so every run produces a different byte-for-byte file. The keys +// sign only this vector and prove nothing else. + +import { createHash, createPrivateKey, sign } from "node:crypto"; +import { existsSync, writeFileSync } from "node:fs"; +import { createRequire } from "node:module"; +import { dirname, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const modulePath = join(repoRoot, "packages", "cultnet-ts", "dist", "cultmesh-authority.js"); +const outputPath = join(repoRoot, "contracts", "cultmesh", "authority-route-vectors.ts-signed.json"); +if (!existsSync(modulePath)) { + throw new Error(`${modulePath} is missing; run 'npm run build --workspace packages/cultnet-ts' first.`); +} +const { canonicalRoute, canonicalSession, verifyAuthorityRoute, verifyProviderSessionProof } = + createRequire(import.meta.url)(modulePath); + +const NOW = 1_800_000_000_000; +const odin = testKey("odin-ts-vector", { + kty: "EC", crv: "P-256", + x: "lqw9TE0EyuDU5Ghe8SafIbBBYkhHMUF7HXJQUc0nXsw", + y: "nUj-Xhakih97JiJcTUNMHM9JIo7MVQaauuAkCXph-tw", + d: "8X45DCbNJ7IR2iPoz5JUC_zB8fHh3zoUJUaAA7mnOnQ", +}); +const provider = testKey("provider-ts-vector", { + kty: "EC", crv: "P-256", + x: "JKyjtWnoE5fhSWbeqr188SbReQWCjssf5mSMEa5pV-E", + y: "vtduzojDpbT49sbxBSsBQ-f3PG3rm-CUk_MTy2MM_ws", + d: "ZSdIb9sLpAfb-nTAUR1Y1re4OsVM4ABJ1Gpq5pStSyQ", +}); + +function testKey(keyId, jwk) { + return { + privateKey: createPrivateKey({ key: jwk, format: "jwk" }), + publicKey: { + keyId, + x: Buffer.from(jwk.x, "base64url").toString("base64"), + y: Buffer.from(jwk.y, "base64url").toString("base64"), + }, + }; +} + +function signP1363(privateKey, payload) { + return sign("sha256", payload, { key: privateKey, dsaEncoding: "ieee-p1363" }).toString("base64"); +} + +const unsigned = { + verseId: "aetheria", + authorityRuntimeId: "aetheria-daemon", + endpoint: "cultmesh-state+quic://provider.example:4433/?cert-sha256=ABCDEF", + protocolIds: ["cultmesh.documents.v1", "cultmesh.content.v1", "cultmesh.realtime.v1"], + priority: 13, + generation: "ts-generation-ünïcode-∞-1", + certificate: { + providerKey: provider.publicKey, + odinKeyId: odin.publicKey.keyId, + issuedAtUnixMilliseconds: NOW - 60_000, + expiresAtUnixMilliseconds: NOW + 3_600_000, + signature: "", + }, +}; +const route = { + ...unsigned, + certificate: { ...unsigned.certificate, signature: signP1363(odin.privateKey, canonicalRoute(unsigned)) }, +}; +const request = { + schemaVersion: "cultmesh.session_open.v2", + messageId: "ts-vector-message-1", + sourceRuntimeId: "ts-vector-consumer", + verseId: "aetheria", + authorityRuntimeId: "aetheria-daemon", + protocolId: "cultmesh.documents.v1", + routeGeneration: route.generation, + clientNonce: createHash("sha256").update("ts-vector-nonce").digest("base64"), +}; +const providerSignature = signP1363(provider.privateKey, canonicalSession(request, route.endpoint)); + +// A file TypeScript cannot verify itself would make a C# refusal meaningless. +await verifyAuthorityRoute(route, { mode: "authenticated-remote", odinRoots: [odin.publicKey], now: () => NOW }); +if (!await verifyProviderSessionProof(request, route.endpoint, provider.publicKey, providerSignature)) { + throw new Error("The TypeScript module refused its own session proof."); +} + +writeFileSync(outputPath, JSON.stringify({ + nowUnixMilliseconds: NOW, + odinRoot: odin.publicKey, + route, + sessionProof: { request, providerKeyId: provider.publicKey.keyId, providerSignature }, +}, null, 2) + "\n"); +console.log(`wrote ${outputPath}`); diff --git a/tests/GameCult.Mesh.Tests/CultMeshAuthorityProofTests.cs b/tests/GameCult.Mesh.Tests/CultMeshAuthorityProofTests.cs index 44c078cc..f89cb40c 100644 --- a/tests/GameCult.Mesh.Tests/CultMeshAuthorityProofTests.cs +++ b/tests/GameCult.Mesh.Tests/CultMeshAuthorityProofTests.cs @@ -332,6 +332,84 @@ public sealed class CultMeshAuthorityProofTests CultMeshAuthorityProof.VerifySessionProof(request, accepted, verseId, route, trust, now).Should().BeTrue(); } + // The other direction. `scripts/sign-cultmesh-authority-vectors.mjs` builds + // the transcripts with the TypeScript module and signs them with + // TypeScript-owned keys over awkward inputs (a quic scheme, unsorted + // protocol ids, non-ASCII generation text, a non-default priority). Only + // the reference implementation judges the file here; the keys come from + // the file, never from this side. + [Test] + public void AuthorityRouteVectorsSignedByTypeScriptVerifyHere() + { + var path = Path.Combine(RepoRoot(), "contracts", "cultmesh", "authority-route-vectors.ts-signed.json"); + using var vectors = JsonDocument.Parse(File.ReadAllText(path)); + var rootElement = vectors.RootElement; + var routeElement = rootElement.GetProperty("route"); + var certificateElement = routeElement.GetProperty("certificate"); + var odinRoot = PublicKey(rootElement.GetProperty("odinRoot")); + var providerKey = PublicKey(certificateElement.GetProperty("providerKey")); + var certificate = new CultMeshRouteCertificate( + providerKey, + certificateElement.GetProperty("odinKeyId").GetString()!, + certificateElement.GetProperty("issuedAtUnixMilliseconds").GetInt64(), + certificateElement.GetProperty("expiresAtUnixMilliseconds").GetInt64(), + certificateElement.GetProperty("signature").GetString()!); + var protocolIds = routeElement.GetProperty("protocolIds").EnumerateArray().Select(value => value.GetString()!).ToArray(); + var priority = routeElement.GetProperty("priority").GetInt32(); + CultMeshAuthorityRoute Route(int routePriority) => new( + routeElement.GetProperty("authorityRuntimeId").GetString()!, + routeElement.GetProperty("endpoint").GetString()!, + protocolIds, + routePriority, + routeElement.GetProperty("generation").GetString(), + certificate); + var route = Route(priority); + var trust = new CultMeshAuthorityTrustPolicy(CultMeshAuthorityTrustMode.AuthenticatedRemote, new[] { odinRoot }); + var now = DateTimeOffset.FromUnixTimeMilliseconds(rootElement.GetProperty("nowUnixMilliseconds").GetInt64()); + var verseId = routeElement.GetProperty("verseId").GetString()!; + + protocolIds.Should().NotBeInAscendingOrder(StringComparer.Ordinal, "the vector must exercise the sort"); + trust.Validate(verseId, route, now); + Action tampered = () => trust.Validate(verseId, Route(priority + 1), now); + tampered.Should().Throw() + .Which.Failure.Message.Should().Be("The Odin route certificate signature is invalid."); + + var proofElement = rootElement.GetProperty("sessionProof"); + var requestElement = proofElement.GetProperty("request"); + var request = new GameCult.Networking.CultMeshSessionOpenMessage + { + MessageId = requestElement.GetProperty("messageId").GetString(), + SourceRuntimeId = requestElement.GetProperty("sourceRuntimeId").GetString(), + VerseId = requestElement.GetProperty("verseId").GetString(), + AuthorityRuntimeId = requestElement.GetProperty("authorityRuntimeId").GetString(), + ProtocolId = requestElement.GetProperty("protocolId").GetString(), + RouteGeneration = requestElement.GetProperty("routeGeneration").GetString(), + ClientNonce = requestElement.GetProperty("clientNonce").GetString() + }; + var accepted = Accepted(request, proofElement.GetProperty("providerSignature").GetString()!); + accepted.ProviderKeyId = proofElement.GetProperty("providerKeyId").GetString()!; + CultMeshAuthorityProof.VerifySessionProof(request, accepted, verseId, route, trust, now).Should().BeTrue(); + + var replayed = new GameCult.Networking.CultMeshSessionOpenMessage + { + MessageId = request.MessageId, + SourceRuntimeId = request.SourceRuntimeId, + VerseId = request.VerseId, + AuthorityRuntimeId = request.AuthorityRuntimeId, + ProtocolId = request.ProtocolId, + RouteGeneration = request.RouteGeneration, + ClientNonce = "replayed" + }; + var replayedAccepted = Accepted(replayed, accepted.ProviderSignature!); + replayedAccepted.ProviderKeyId = accepted.ProviderKeyId; + CultMeshAuthorityProof.VerifySessionProof(replayed, replayedAccepted, verseId, route, trust, now).Should().BeFalse(); + } + + private static CultMeshEcdsaP256PublicKey PublicKey(JsonElement element) => new( + element.GetProperty("keyId").GetString()!, + element.GetProperty("x").GetString()!, + element.GetProperty("y").GetString()!); + private static string RepoRoot() { var directory = new DirectoryInfo(TestContext.CurrentContext.TestDirectory); From cf1203a6077f96786ad260a77db9220294a3892c Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 16:28:29 +0200 Subject: [PATCH 32/94] Run the C# authority vector checks in CI `CultMeshAuthorityProofTests` verifies both vector files with the C# reference, but no workflow ran it. The portability workflow's reactive-and-resource-lifetime job is the one that already builds and runs `GameCult.Mesh.Tests` on every push to main and codex branches and on every pull request, on Windows and Ubuntu, so it gains one step: `dotnet test --filter FullyQualifiedName~AuthorityProof`. The interop workflow was not chosen: it runs on Windows only, on main pushes only, and runs no Mesh tests. It already covers the TypeScript direction through `npm test --workspace packages/cultnet-ts`. CULTMESH_WRITE_VECTORS stays unset in CI; the committed files are the contract. Co-Authored-By: Claude Fable 5.1 --- .github/workflows/cultmesh-portability.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/cultmesh-portability.yml b/.github/workflows/cultmesh-portability.yml index ce361fc8..55d2bea8 100644 --- a/.github/workflows/cultmesh-portability.yml +++ b/.github/workflows/cultmesh-portability.yml @@ -95,3 +95,15 @@ jobs: dotnet test tests/GameCult.Mesh.Tests/GameCult.Mesh.Tests.csproj --filter FullyQualifiedName~Document_OneHundredThousandDistinctLeaseCyclesLeaveNoResourcesOrCallbacks --logger "console;verbosity=minimal" + + # Both directions of the CultMesh authority vectors: the C#-written + # file (contracts/cultmesh/authority-route-vectors.json) and the + # TypeScript-signed file (authority-route-vectors.ts-signed.json) are + # verified by the C# reference here; the TypeScript side verifies both + # in `npm test --workspace packages/cultnet-ts`. CULTMESH_WRITE_VECTORS + # is never set in CI: the committed files are the contract. + - name: Verify the CultMesh authority vectors with the C# reference + run: >- + dotnet test tests/GameCult.Mesh.Tests/GameCult.Mesh.Tests.csproj + --filter FullyQualifiedName~AuthorityProof + --logger "console;verbosity=minimal" From 0e4f479ac53f274fe2d8df45d88f72a18318867c Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 16:34:31 +0200 Subject: [PATCH 33/94] Make the mutation runner leave no mutant behind Every test run inside the runner rebuilds `packages/cultnet-ts/dist/` from the mutant under test, so after the final restore of the source the compiled module still carried the last mutant. The runner now rebuilds the package after the restore and asserts `dist/cultmesh-authority.js` contains a sentinel the last listed mutation removes, checked against the list itself so a reordering cannot make the assertion vacuous. The original bytes are also written to `.mutation-original` before the first write and removed after the verified restore. A run killed mid-mutation is repaired from that sidecar at the next run's start, instead of by whoever notices git status. Co-Authored-By: Claude Fable 5.1 --- scripts/mutate-cultmesh-authority.mjs | 45 ++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/scripts/mutate-cultmesh-authority.mjs b/scripts/mutate-cultmesh-authority.mjs index 3e093414..cb4cae16 100644 --- a/scripts/mutate-cultmesh-authority.mjs +++ b/scripts/mutate-cultmesh-authority.mjs @@ -7,18 +7,29 @@ // bytes with a digest check, never from git. A no-op control runs first through // the same write path so a false kill from the write itself cannot hide. // +// The original bytes also live in `.mutation-original` from the first +// write until a verified restore; a run killed mid-mutation is repaired from +// that sidecar by the next run, not by git. After the final restore the +// package is rebuilt so `dist/` never carries the last mutant. +// // node scripts/mutate-cultmesh-authority.mjs import { createHash } from "node:crypto"; import { execFileSync } from "node:child_process"; -import { readFileSync, writeFileSync } from "node:fs"; +import { existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs"; import { dirname, join, resolve } from "node:path"; import { fileURLToPath } from "node:url"; const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const target = join(repoRoot, "packages", "cultnet-ts", "src", "cultmesh-authority.ts"); +const sidecar = `${target}.mutation-original`; +const dist = join(repoRoot, "packages", "cultnet-ts", "dist", "cultmesh-authority.js"); const npmCli = process.env.npm_execpath ?? join(dirname(process.execPath), "node_modules", "npm", "bin", "npm-cli.js"); +// Present in the restored source and compiled verbatim into dist/; the last +// mutation in the list removes it, which is what makes the post-rebuild check +// distinguish a rebuilt dist/ from one still carrying that mutant. +const sentinel = 'scheme === "https"'; const mutations = [ { @@ -136,6 +147,12 @@ const mutations = [ }, ]; +if (existsSync(sidecar)) { + writeFileSync(target, readFileSync(sidecar)); + unlinkSync(sidecar); + console.log(`repaired ${target} from ${sidecar}: a previous run stopped before restoring it`); +} + const original = readFileSync(target); const originalText = original.toString("utf8"); const originalDigest = digest(original); @@ -149,12 +166,16 @@ function digest(bytes) { return createHash("sha256").update(bytes).digest("hex"); } +function npm(...args) { + execFileSync(process.execPath, [npmCli, ...args, "--workspace", "packages/cultnet-ts"], { + cwd: repoRoot, + stdio: ["ignore", "pipe", "pipe"], + }); +} + function testsPass() { try { - execFileSync(process.execPath, [npmCli, "run", "test", "--workspace", "packages/cultnet-ts"], { - cwd: repoRoot, - stdio: ["ignore", "pipe", "pipe"], - }); + npm("run", "test"); return true; } catch { return false; @@ -176,6 +197,12 @@ function occurrences(text, needle) { const results = []; let failed = false; +const last = mutations[mutations.length - 1]; +if (!originalText.includes(sentinel) || originalText.replace(withEol(last.old), withEol(last.new)).includes(sentinel)) { + throw new Error(`the sentinel '${sentinel}' must be in the source and removed by the last mutation ('${last.rule}')`); +} + +writeFileSync(sidecar, original); try { writeFileSync(target, Buffer.from(originalText, "utf8")); const controlPass = testsPass(); @@ -198,7 +225,15 @@ try { } finally { restore(); } +unlinkSync(sidecar); + +// Every test run above rebuilt dist/ from a mutant; put the restored source back in it. +npm("run", "build"); +if (!readFileSync(dist, "utf8").includes(sentinel)) { + throw new Error(`${dist} does not contain '${sentinel}' after the rebuild; it still carries a mutant`); +} for (const result of results) console.log(`${result.outcome.padEnd(9)} ${result.rule}`); console.log(`restored ${target} sha256=${originalDigest}`); +console.log(`rebuilt ${dist}`); process.exit(failed ? 1 : 0); From e3f56c183f58b5bcc2248709fdf8c9372a1d3586 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 16:37:04 +0200 Subject: [PATCH 34/94] Record the Cut 1 fix batch Both parity directions are now pinned in the repo and run in CI, the public verifier copies its bytes, and the four edge rules match the C# reference, with the loopback set probed rather than assumed. One scar: the runner's multi-line anchors had never matched on a CRLF checkout, so two earlier kill claims rested on an LF-on-disk state. One browser-side divergence remains and is in Hands. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index b584b409..237965c0 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -51,6 +51,36 @@ a probe over adversarial inputs, which nothing in the repo yet pins. Found: ignores `exports`, so `cultnet-ts/authority` is unresolvable from that package until Cut 4 changes it; the root re-export covers it today. +**The Cut 1 fix batch landed** at `c2ffc32` (`verifyP256` copies its bytes; +empty or whitespace signature is unsigned; root lookup before the validity +window; duplicate root key ids refuse at first use; the loopback set is +C#'s, probed through the public policy: `127.0.0.0/8` in any spelling +`URL` normalises, `::1`, the IPv4-mapped `::ffff:7f00:1`, `localhost`, +`loopback`; `localhost.`, `0.0.0.0`, `::` and `::ffff:127.0.0.2` are not), +`1590145` (`scripts/sign-cultmesh-authority-vectors.mjs` writes +`contracts/cultmesh/authority-route-vectors.ts-signed.json` over adversarial +inputs and a C# test verifies it; a one-character change to the committed +signature fails that test), `cf1203a` (`cultmesh-portability.yml` runs +`dotnet test --filter AuthorityProof` on both OSes on every push; the +interop workflow was Windows-only and main-only) and `0e4f479` (the runner +rebuilds `dist/` after the final restore and asserts a sentinel from the +restored source; a sidecar of the original bytes is written first and +repaired from at the next start). Twenty mutations, twenty killed. Tests +74, 17, 10; closure smoke four tarballs. + +Scars from the batch: **the runner's two multi-line anchors matched nothing +on a CRLF checkout** (the tree is `autocrlf=true`, HEAD is LF, the anchors +were `\n`), so the runner would have thrown at those entries; the earlier +"killed" claims for the transcript-order and nonce mutations came from an +LF-on-disk state. Anchors are now normalised to the file's EOL. Fixes 1 and +2 share one commit because Hands had made both before committing. +**Still open after the batch:** the browser client's local-development +short-circuit at `packages/cultmesh-browser/src/index.ts:915` tests +`!route.certificate` where the shared verifier now treats an empty +signature as unsigned, so such a route passes the verifier and is then +asked for a provider proof, where C# would not ask. In Hands as a one-line +alignment through a shared predicate. + Anchor: repo `F:\Projects\CultLib`, branch `main`, HEAD `8d8ad568aa280bac34bf123503a9e38c175eb558`. The three commits since the original anchor `f2cd2eb4` (`bf9f6f7`, `3c29fc9`, `8d8ad56`) touch only this From a801e0a441573aa93bfb3f5776116dfd82e45fa0 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 16:43:09 +0200 Subject: [PATCH 35/94] Share one reading of an unsigned certificate between verifier and browser The browser's local-development session-proof short-circuit tested `!route.certificate`, while the shared verifier already treated an empty or whitespace signature as unsigned, matching C# `Verify` (`:120`). A loopback route carrying a blank-signature certificate therefore passed the verifier and was then refused for lacking a provider key, where C# returns `IsLocalDevelopment` and skips the session proof. `isUnsignedCertificate` in `cultnet-ts/authority` is now the one owner of that reading; the verifier and the browser both call it. A browser test pins the local-development loopback open without a provider proof, the signed loopback certificate still demanding it, and the remote counterpart refused in both trust modes. The mutation runner gains two predicate mutations (whitespace treated as signed; only a missing certificate treated as unsigned), both killed by the existing whitespace-signature test in cultnet-ts. Co-Authored-By: Claude Fable 5.1 --- packages/cultmesh-browser/src/index.ts | 7 ++++- .../test/cultmesh-browser.test.ts | 31 +++++++++++++++++++ packages/cultnet-ts/src/cultmesh-authority.ts | 17 +++++++--- packages/cultnet-ts/src/index.ts | 1 + scripts/mutate-cultmesh-authority.mjs | 11 +++++-- 5 files changed, 58 insertions(+), 9 deletions(-) diff --git a/packages/cultmesh-browser/src/index.ts b/packages/cultmesh-browser/src/index.ts index 86d933d1..0398d313 100644 --- a/packages/cultmesh-browser/src/index.ts +++ b/packages/cultmesh-browser/src/index.ts @@ -19,6 +19,7 @@ import { base64ToBytes, bytesToBase64, isLoopbackEndpoint, + isUnsignedCertificate, verifyAuthorityRoute, verifyProviderSessionProof, type CultMeshAuthorityIdentity, @@ -912,7 +913,11 @@ async function validateSessionAcceptance( `expected '${request.verseId}/${request.authorityRuntimeId}/${protocolId}/${route.generation}'.`, ); } - if (trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint) && !route.certificate) return undefined; + // `CultMeshVerifiedAuthorityRoute.IsLocalDevelopment` in C#: an unsigned + // loopback route under local-development needs no provider session proof. + if (trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint) && isUnsignedCertificate(route.certificate)) { + return undefined; + } const providerKey = route.certificate?.providerKey; if (!providerKey || message.providerKeyId !== providerKey.keyId || !message.providerSignature) { return new Error("CultMesh authority did not prove possession of the Odin-certified provider key."); diff --git a/packages/cultmesh-browser/test/cultmesh-browser.test.ts b/packages/cultmesh-browser/test/cultmesh-browser.test.ts index 6c169d93..77237bb9 100644 --- a/packages/cultmesh-browser/test/cultmesh-browser.test.ts +++ b/packages/cultmesh-browser/test/cultmesh-browser.test.ts @@ -236,6 +236,37 @@ test("browser client rejects a credential-free authority impersonator", async () ); }); +test("browser client opens an unsigned-certificate loopback session under local-development without a provider proof, as in C#", async () => { + const connect = (route: CultMeshBrowserRoute, trust: { mode: "local-development" | "authenticated-remote"; odinRoots: CultMeshBrowserP256PublicKey[] }) => + CultMeshBrowserClient.connect({ + ...route, + runtimeId: "browser-unsigned-certificate-test", + rendezvous: { resolve: async () => route }, + trust, + socketFactory: () => handshakeOnlySocket(route), + }); + const blank = (route: CultMeshBrowserRoute) => ({ ...route, certificate: { ...route.certificate!, signature: "" } }); + + const loopback = await createSignedRoute("ws://127.0.0.1:4501/mesh"); + const localTrust = { mode: "local-development" as const, odinRoots: [loopback.odinPublic] }; + const client = await connect(blank(loopback.route), localTrust); + assert.equal(client.state, "connected"); + await client.dispose(); + // A signed loopback certificate is an authenticated route even under + // local-development; the provider must still prove its key. + await assert.rejects(connect(loopback.route, localTrust), /did not prove possession/); + + const remote = await createSignedRoute("wss://provider.example/mesh"); + await assert.rejects( + connect(blank(remote.route), { mode: "local-development", odinRoots: [remote.odinPublic] }), + /Odin-signed authority certificate/, + ); + await assert.rejects( + connect(blank(remote.route), { mode: "authenticated-remote", odinRoots: [remote.odinPublic] }), + /Odin-signed authority certificate/, + ); +}); + test("browser client rejects a mutated or expired signed route before opening a provider socket", async () => { const fixture = await createSignedRoute("wss://provider.example/mesh"); let opened = false; diff --git a/packages/cultnet-ts/src/cultmesh-authority.ts b/packages/cultnet-ts/src/cultmesh-authority.ts index fd0fcce6..40bcff1a 100644 --- a/packages/cultnet-ts/src/cultmesh-authority.ts +++ b/packages/cultnet-ts/src/cultmesh-authority.ts @@ -44,23 +44,30 @@ export interface CultMeshAuthorityTrustPolicy { now?: () => number; } +// A missing certificate, or one whose signature is empty or whitespace, is an +// unsigned route (`CultMeshRouteCertificate` trims the signature; `Verify` +// treats a whitespace signature as no certificate). The verifier and the +// browser's session-proof short-circuit share this one reading, as the C# +// `Verify` and `IsLocalDevelopment` do. +export function isUnsignedCertificate(certificate: CultMeshAuthorityRouteCertificate | undefined): boolean { + return !certificate || certificate.signature.trim() === ""; +} + // Rule for rule, this is `CultMeshAuthorityTrustPolicy.Verify` in the C# // reference, in the same order: unsigned, channel protection, root lookup, // validity window, signature. The same input yields the same refusal on both -// sides. A certificate whose signature is empty or whitespace is unsigned -// (`CultMeshRouteCertificate` trims the signature; `Verify` treats a -// whitespace signature as no certificate). +// sides. export async function verifyAuthorityRoute( route: CultMeshAuthorityRouteView, trust: CultMeshAuthorityTrustPolicy, ): Promise { const roots = trustedOdinRoots(trust); const certificate = route.certificate; - const signature = certificate?.signature.trim() ?? ""; - if (!certificate || signature === "") { + if (!certificate || isUnsignedCertificate(certificate)) { if (trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint)) return; throw new Error("Remote CultMesh routes require an Odin-signed authority certificate."); } + const signature = certificate.signature.trim(); if (!isProtectedEndpoint(route.endpoint) && !(trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint))) { throw new Error("Authenticated remote CultMesh routes require TLS or QUIC channel protection."); } diff --git a/packages/cultnet-ts/src/index.ts b/packages/cultnet-ts/src/index.ts index e9260122..4987b177 100644 --- a/packages/cultnet-ts/src/index.ts +++ b/packages/cultnet-ts/src/index.ts @@ -70,6 +70,7 @@ export { canonicalSession, isLoopbackEndpoint, isProtectedEndpoint, + isUnsignedCertificate, verifyAuthorityRoute, verifyP256, verifyProviderSessionProof, diff --git a/scripts/mutate-cultmesh-authority.mjs b/scripts/mutate-cultmesh-authority.mjs index cb4cae16..6053cb14 100644 --- a/scripts/mutate-cultmesh-authority.mjs +++ b/scripts/mutate-cultmesh-authority.mjs @@ -58,9 +58,14 @@ const mutations = [ new: "const root = [...roots.values()][0];", }, { - rule: "empty or whitespace signature is an unsigned route", - old: 'if (!certificate || signature === "") {', - new: "if (!certificate) {", + rule: "isUnsignedCertificate treats a whitespace signature as unsigned", + old: 'return !certificate || certificate.signature.trim() === "";', + new: 'return !certificate || certificate.signature === "";', + }, + { + rule: "isUnsignedCertificate treats an empty signature as unsigned", + old: 'return !certificate || certificate.signature.trim() === "";', + new: "return !certificate;", }, { rule: "root lookup precedes the validity window", From 04087c6ab63905c8eccc036d241a88ed2edd3b29 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 16:45:00 +0200 Subject: [PATCH 36/94] Record the browser session alignment and widen the name grep The browser's local-development short-circuit reads "unsigned" through the shared predicate, so the two TypeScript sides cannot disagree with each other or with C#. The negative grep now names the two functions the fix batch added. The generated contracts file's line-ending churn is recorded where unassigned findings live. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index 237965c0..2513e85c 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -78,8 +78,18 @@ LF-on-disk state. Anchors are now normalised to the file's EOL. Fixes 1 and short-circuit at `packages/cultmesh-browser/src/index.ts:915` tests `!route.certificate` where the shared verifier now treats an empty signature as unsigned, so such a route passes the verifier and is then -asked for a provider proof, where C# would not ask. In Hands as a one-line -alignment through a shared predicate. +asked for a provider proof, where C# would not ask. **Landed** at `a801e0a`: +`isUnsignedCertificate` is exported from the shared module and used by the +verifier and the browser's session check, with a browser test for the +blank-signature loopback route, the signed loopback route that still needs +a proof, and the blank-signature remote refused in both modes. Twenty-one +mutations, twenty-one killed. Tests 74, 18, 10. Second Soul pass in flight. + +Seen by Hands, recorded for section 15: `packages/cultnet-ts/src/generated/swarm-contracts.generated.ts` +is rewritten with LF by every build while the tree is `autocrlf=true`, so +it shows modified with zero content diff after any build; the generator's +line endings and the repo's normalisation disagree, and every pass discards +the churn by hand. Anchor: repo `F:\Projects\CultLib`, branch `main`, HEAD `8d8ad568aa280bac34bf123503a9e38c175eb558`. The three commits since the @@ -577,8 +587,12 @@ Verification: `cultmesh-browser` tarball must resolve `cultnet-ts/authority` from the registry-shaped install at `scripts/test-typescript-package-closure.mjs:63-72`). - Negative greps (must return nothing): - `rg -n "crypto\.subtle\.(verify|importKey)|function (verifyAuthorityRoute|canonicalRoute|canonicalSession|canonicalFields|verifyP256|isLoopbackEndpoint)" packages/cultmesh-browser/src packages/cultmesh-ts/src` + `rg -n "crypto\.subtle\.(verify|importKey)|function (verifyAuthorityRoute|canonicalRoute|canonicalSession|canonicalFields|verifyP256|isLoopbackEndpoint|isProtectedEndpoint|isUnsignedCertificate)" packages/cultmesh-browser/src packages/cultmesh-ts/src` and `rg -n "cultmesh-browser" packages/cultmesh-ts/package.json packages/cultnet-ts/package.json`. + *(The name list grew by two after the fix batch: `isProtectedEndpoint`, + written fresh as the C# rule, and `isUnsignedCertificate`, the shared + reading of "unsigned" the browser's session check now uses. Soul noted + the grep pins names, not structure; a shim under another name passes it.)* - Operator-only: none. ## 7. Cut 2 (behaviour, pure TypeScript): the realtime frame codec From b7bb483989382f15f62faece612612e5db7dbb20 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 17:02:03 +0200 Subject: [PATCH 37/94] Record Soul's second Cut 1 pass The cut closes on its invariants. What is left is the gap between the C# rules as written and as executed: the route is cleaned before the transcript on one side and transcribed raw on the other, whitespace and loopback are decided by different alphabets at the edges, and the browser guard is enforced by name only. All in a final Hands batch before Cut 4 makes a TypeScript signer real. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 42 +++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index 2513e85c..69e94093 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -83,7 +83,47 @@ asked for a provider proof, where C# would not ask. **Landed** at `a801e0a`: verifier and the browser's session check, with a browser test for the blank-signature loopback route, the signed loopback route that still needs a proof, and the blank-signature remote refused in both modes. Twenty-one -mutations, twenty-one killed. Tests 74, 18, 10. Second Soul pass in flight. +mutations, twenty-one killed. Tests 74, 18, 10. + +**Second Soul pass, 2026-09-16.** Held: byte copy, root before window, duplicate +root ids refusing on the unsigned path in either insertion order, the sort +pinned, the U+001F separator on both sides, 33 of 39 field tampers failing the +C# test with the survivors explained, the runner repairing itself after a +SIGKILL and leaving `dist/` free of every mutant string, all 21 anchors +matching once on both LF and CRLF copies, and every test and grep. Cut 1 +closes on its stated invariants. Four edge divergences from the C# rules +remain, with one guard gap, to be fixed before Cut 4 makes a non-C# signer +real (in Hands): + +- **`isLoopbackEndpoint` is not `Uri.IsLoopback`**: 15 of 90 probed + endpoints disagree. Seven are reachable and TS-wider (a trailing dot on + the host, `ws:` without `//`, a backslash separator, fullwidth characters, + a tab), because `URL` normalises what C# refuses; eight are C#-wider and + unreachable in the browser (zone ids the `URL` parser throws on, + `file:`/`mailto:` schemes the filter drops). The doc comment claimed + equivalence. Low: local-development only. +- **`trim()` is not `char.IsWhiteSpace`** at U+0085 (C# whitespace, TS not) + and U+FEFF (TS trims, C# does not), so a signature of either is + "unsigned" on one side and "signed" on the other; both are carriable on + the rendezvous wire. Low, fail-open only where an absent certificate is + already accepted. +- **C# cleans the route before the transcript and TS transcribes raw**: + duplicate or padded protocol ids, padded generation and padded key ids + verify in C# and refuse in TS, and an absent protocol list gets a default + in TS and `""` in C#. Latent while every signer is C#; live at the first + TS signer. Low-medium. +- **Two C# refusals collapse into one TS message** (not base64; not P1363). + Low. +- **A local `=== ""` shim beside the shared call in the browser survives + every test**, because no browser test uses a whitespace signature; the + name grep is silent by construction. Low-medium. +- **No workflow runs the `cultnet-ts` tests on Linux**, and the interop + workflow is Windows-only and main-only; on a `codex/**` push only the C# + half of the vector check runs. Low. +- Recorded, not a defect: the TS-signed vector is not reproducible + byte-for-byte (random `k`); the C# test pins that the committed bytes + verify under current rules, and the TS test pins that the committed file + verifies under the current module. Seen by Hands, recorded for section 15: `packages/cultnet-ts/src/generated/swarm-contracts.generated.ts` is rewritten with LF by every build while the tree is `autocrlf=true`, so From e67e695a630f88b2ea81f560ffee1ad70d53fde9 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 17:09:48 +0200 Subject: [PATCH 38/94] Read whitespace and the signature refusals as C# does Two edge alignments that have to land together, because the test for the first asserts the messages of the second. `String.prototype.trim` is not `char.IsWhiteSpace`. JavaScript counts U+FEFF, which .NET does not; .NET counts U+0085, which JavaScript does not. Every `trim()` in the shared verifier stood in for a C# `IsNullOrWhiteSpace` or `Trim()`, so both were wrong at those two code points: a U+0085 signature was an unsigned route to C# and a bad signature to TypeScript, and a U+FEFF signature the other way round. `isCSharpWhiteSpace`, `trimCSharp` and `isNullOrWhiteSpaceCSharp` are that set, and `isUnsignedCertificate` and the signature trim now use it. The test pins all 34 code points Soul probed on both sides against the answers .NET 10 gave on 2026-09-16. The C# `Verify` also has three signature refusals, not one: a signature that is not base64, a decoded length that is not 64, and a signature that decodes but does not verify. TypeScript collapsed the first two into the third and lost the distinction the reference draws. Split, with each message pinned by its exact C# string. `verifyP256` keeps its own checks: it is the silent `VerifySession` path, which returns false for all three. Mutations: the whitespace-set site reverted to `String.prototype.trim`, U+0085 dropped from the set, and the two new messages merged back into "invalid" -- each killed by its test. Co-Authored-By: Claude Fable 5.1 --- packages/cultnet-ts/src/cultmesh-authority.ts | 51 +++++++++++++- packages/cultnet-ts/src/index.ts | 3 + .../test/cultmesh-authority.test.ts | 68 ++++++++++++++++++- scripts/mutate-cultmesh-authority.mjs | 25 ++++++- 4 files changed, 142 insertions(+), 5 deletions(-) diff --git a/packages/cultnet-ts/src/cultmesh-authority.ts b/packages/cultnet-ts/src/cultmesh-authority.ts index 40bcff1a..f3a9121d 100644 --- a/packages/cultnet-ts/src/cultmesh-authority.ts +++ b/packages/cultnet-ts/src/cultmesh-authority.ts @@ -44,13 +44,45 @@ export interface CultMeshAuthorityTrustPolicy { now?: () => number; } +/** + * `char.IsWhiteSpace` in .NET: Unicode Zs, plus Zl (U+2028), Zp (U+2029), + * U+0009-U+000D and U+0085. + * + * `String.prototype.trim` is a different set and cannot stand in for it: + * JavaScript counts U+FEFF, which .NET does not, and skips U+0085, which .NET + * counts. U+200B and U+180E are whitespace to neither (U+180E left Zs in + * Unicode 6.3). Wherever the C# reference writes `IsNullOrWhiteSpace` or + * `Trim()`, this is the set it means, so this is the set the TypeScript rules + * use. + */ +export function isCSharpWhiteSpace(character: string): boolean { + const code = character.charCodeAt(0); + return code === 0x20 || (code >= 0x09 && code <= 0x0d) || code === 0x85 || code === 0xa0 || + code === 0x1680 || (code >= 0x2000 && code <= 0x200a) || + code === 0x2028 || code === 0x2029 || code === 0x202f || code === 0x205f || code === 0x3000; +} + +/** `string.Trim()` in .NET, over `isCSharpWhiteSpace`. */ +export function trimCSharp(value: string): string { + let start = 0; + let end = value.length; + while (start < end && isCSharpWhiteSpace(value[start]!)) start += 1; + while (end > start && isCSharpWhiteSpace(value[end - 1]!)) end -= 1; + return value.slice(start, end); +} + +/** `string.IsNullOrWhiteSpace` in .NET, over `isCSharpWhiteSpace`. */ +export function isNullOrWhiteSpaceCSharp(value: string | undefined | null): boolean { + return value === undefined || value === null || trimCSharp(value).length === 0; +} + // A missing certificate, or one whose signature is empty or whitespace, is an // unsigned route (`CultMeshRouteCertificate` trims the signature; `Verify` // treats a whitespace signature as no certificate). The verifier and the // browser's session-proof short-circuit share this one reading, as the C# // `Verify` and `IsLocalDevelopment` do. export function isUnsignedCertificate(certificate: CultMeshAuthorityRouteCertificate | undefined): boolean { - return !certificate || certificate.signature.trim() === ""; + return !certificate || isNullOrWhiteSpaceCSharp(certificate.signature); } // Rule for rule, this is `CultMeshAuthorityTrustPolicy.Verify` in the C# @@ -67,7 +99,7 @@ export async function verifyAuthorityRoute( if (trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint)) return; throw new Error("Remote CultMesh routes require an Odin-signed authority certificate."); } - const signature = certificate.signature.trim(); + const signature = trimCSharp(certificate.signature); if (!isProtectedEndpoint(route.endpoint) && !(trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint))) { throw new Error("Authenticated remote CultMesh routes require TLS or QUIC channel protection."); } @@ -77,6 +109,21 @@ export async function verifyAuthorityRoute( if (now < certificate.issuedAtUnixMilliseconds || now >= certificate.expiresAtUnixMilliseconds) { throw new Error("The Odin route certificate is not currently valid."); } + // Three refusals, not one. `Verify` in the C# reference decodes the signature + // itself and names each failure separately: `Convert.FromBase64String` throwing + // is "not base64", a decoded length other than 64 is "not IEEE P1363 P-256", + // and only a decoded-but-wrong signature is "invalid". `VerifySession` is the + // silent path: it returns false for all three, which is why `verifyP256` keeps + // its own checks. + let signatureBytes: Uint8Array; + try { + signatureBytes = base64ToBytes(signature); + } catch { + throw new Error("The Odin route signature is not base64."); + } + if (signatureBytes.byteLength !== 64) { + throw new Error("The Odin route signature is not IEEE P1363 P-256."); + } if (!await verifyP256(root, canonicalRoute(route), signature)) { throw new Error("The Odin route certificate signature is invalid."); } diff --git a/packages/cultnet-ts/src/index.ts b/packages/cultnet-ts/src/index.ts index 4987b177..073d2587 100644 --- a/packages/cultnet-ts/src/index.ts +++ b/packages/cultnet-ts/src/index.ts @@ -68,9 +68,12 @@ export { canonicalFields, canonicalRoute, canonicalSession, + isCSharpWhiteSpace, isLoopbackEndpoint, + isNullOrWhiteSpaceCSharp, isProtectedEndpoint, isUnsignedCertificate, + trimCSharp, verifyAuthorityRoute, verifyP256, verifyProviderSessionProof, diff --git a/packages/cultnet-ts/test/cultmesh-authority.test.ts b/packages/cultnet-ts/test/cultmesh-authority.test.ts index 5cd47245..b8fc2509 100644 --- a/packages/cultnet-ts/test/cultmesh-authority.test.ts +++ b/packages/cultnet-ts/test/cultmesh-authority.test.ts @@ -20,8 +20,11 @@ import { canonicalFields, canonicalRoute, canonicalSession, + isCSharpWhiteSpace, isLoopbackEndpoint, isProtectedEndpoint, + isUnsignedCertificate, + trimCSharp, verifyAuthorityRoute, verifyP256, verifyProviderSessionProof, @@ -219,12 +222,32 @@ test("a signature that is not 64 P1363 bytes is refused", async () => { { ...route, certificate: { ...route.certificate!, signature: bytesToBase64(wrong) } }, remoteTrust(odin.publicKey), ), - /signature is invalid/, + /not IEEE P1363 P-256/, ); } assert.equal(await verifyP256(odin.publicKey, canonicalRoute(route), "not base64!"), false); }); +// The C# `Verify` has three signature refusals with three texts. Collapsing any +// two of them loses a distinction the reference draws, so each is pinned by its +// exact C# string, not by a fragment. +test("the three signature refusals carry the C# reference's exact messages", async () => { + const { route, odin } = signedRoute(); + const certificate = route.certificate!; + const cases: readonly (readonly [string, string])[] = [ + ["not base64!", "The Odin route signature is not base64."], + [bytesToBase64(base64ToBytes(certificate.signature).subarray(0, 63)), "The Odin route signature is not IEEE P1363 P-256."], + [bytesToBase64(new Uint8Array(64)), "The Odin route certificate signature is invalid."], + ]; + for (const [signature, message] of cases) { + await assert.rejects( + verifyAuthorityRoute({ ...route, certificate: { ...certificate, signature } }, remoteTrust(odin.publicKey)), + (error: Error) => error.message === message, + message, + ); + } +}); + test("verifyP256 reads exactly the viewed bytes: a Uint8Array, a pooled Buffer and a subarray of a large allocation verify alike", async () => { const { route, odin } = signedRoute(); const payload = canonicalRoute(route); @@ -306,6 +329,49 @@ test("isLoopbackEndpoint is the C# System.Uri.IsLoopback set", () => { } }); +// `char.IsWhiteSpace` as .NET 10 answered for each of these code points on +// 2026-09-16, through `CultMeshAuthorityTrustPolicy` over a signature of that +// one character. `String.prototype.trim` disagrees on two of them: U+0085, +// which .NET counts and JavaScript does not, and U+FEFF, which JavaScript +// counts and .NET does not. +const CSHARP_WHITESPACE_ANSWERS: readonly (readonly [number, boolean])[] = [ + [0x0000, false], [0x0009, true], [0x000a, true], [0x000b, true], [0x000c, true], [0x000d, true], + [0x001c, false], [0x001d, false], [0x001e, false], [0x001f, false], [0x0020, true], + [0x0085, true], [0x00a0, true], [0x1680, true], [0x180e, false], + [0x2000, true], [0x2001, true], [0x2002, true], [0x2003, true], [0x2004, true], [0x2005, true], + [0x2006, true], [0x2007, true], [0x2008, true], [0x2009, true], [0x200a, true], + [0x200b, false], [0x200c, false], [0x2028, true], [0x2029, true], + [0x202f, true], [0x205f, true], [0x3000, true], [0xfeff, false], +]; + +test("the whitespace set is C#'s char.IsWhiteSpace, not String.prototype.trim", async () => { + assert.equal(CSHARP_WHITESPACE_ANSWERS.length, 34); + const { route, odin } = signedRoute("ws://127.0.0.1:4050/mesh"); + for (const [code, csharp] of CSHARP_WHITESPACE_ANSWERS) { + const character = String.fromCharCode(code); + const label = `U+${code.toString(16).toUpperCase().padStart(4, "0")}`; + assert.equal(isCSharpWhiteSpace(character), csharp, label); + const padded = `${character}a${character}`; + assert.equal(trimCSharp(padded), csharp ? "a" : padded, label); + // The same answer where the rule is actually consumed: a certificate whose + // whole signature is this one character is unsigned exactly when C# says so. + const certificate = { ...route.certificate!, signature: character }; + assert.equal(isUnsignedCertificate(certificate), csharp, label); + const blank = { ...route, certificate }; + const trust = { ...remoteTrust(odin.publicKey), mode: "local-development" as const }; + if (csharp) { + await verifyAuthorityRoute(blank, trust); + } else { + await assert.rejects(verifyAuthorityRoute(blank, trust), /not base64|not IEEE P1363/, label); + } + } + // The two code points where `trim` would have answered differently. + assert.equal("…".trim().length, 1); + assert.equal(isCSharpWhiteSpace("…"), true); + assert.equal("".trim().length, 0); + assert.equal(isCSharpWhiteSpace(""), false); +}); + test("base64 helpers round-trip across the 32 KiB chunk boundary", () => { const bytes = new Uint8Array(70_000).map((_, index) => index % 251); assert.deepEqual(base64ToBytes(bytesToBase64(bytes)), bytes); diff --git a/scripts/mutate-cultmesh-authority.mjs b/scripts/mutate-cultmesh-authority.mjs index 6053cb14..176c7f7f 100644 --- a/scripts/mutate-cultmesh-authority.mjs +++ b/scripts/mutate-cultmesh-authority.mjs @@ -59,14 +59,35 @@ const mutations = [ }, { rule: "isUnsignedCertificate treats a whitespace signature as unsigned", - old: 'return !certificate || certificate.signature.trim() === "";', + old: "return !certificate || isNullOrWhiteSpaceCSharp(certificate.signature);", new: 'return !certificate || certificate.signature === "";', }, { rule: "isUnsignedCertificate treats an empty signature as unsigned", - old: 'return !certificate || certificate.signature.trim() === "";', + old: "return !certificate || isNullOrWhiteSpaceCSharp(certificate.signature);", new: "return !certificate;", }, + { + rule: "the whitespace set is C#'s char.IsWhiteSpace, not String.prototype.trim", + old: "return !certificate || isNullOrWhiteSpaceCSharp(certificate.signature);", + new: 'return !certificate || certificate.signature.trim() === "";', + }, + { + rule: "U+0085 is whitespace to C# (String.prototype.trim disagrees)", + old: "code === 0x85 || ", + new: "", + }, + { + rule: "the two non-verifying signature refusals keep their own C# messages", + old: ' throw new Error("The Odin route signature is not base64.");\n' + + " }\n" + + " if (signatureBytes.byteLength !== 64) {\n" + + ' throw new Error("The Odin route signature is not IEEE P1363 P-256.");\n', + new: ' throw new Error("The Odin route certificate signature is invalid.");\n' + + " }\n" + + " if (signatureBytes.byteLength !== 64) {\n" + + ' throw new Error("The Odin route certificate signature is invalid.");\n', + }, { rule: "root lookup precedes the validity window", old: " const root = roots.get(certificate.odinKeyId);\n" + From c4c23308054e90578f25f58b4bae28b802db499a Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 17:14:35 +0200 Subject: [PATCH 39/94] Clean the route fields before the transcript, as the C# constructors do The C# reference signs a transcript over a *constructed* route, and the constructors clean on the way in: `CultMeshAuthorityRoute.Clean` trims each protocol id, drops the blank ones, keeps one of each ordinally and sorts ordinally; `RequireNonEmpty` trims the runtime id and endpoint; `Require` trims the provider key id and coordinates; `CultMeshRouteCertificate` trims the Odin key id; a blank generation becomes the runtime id and endpoint joined by "@". TypeScript cleaned none of it and transcribed the caller's string, so a route C# signed and accepted was refused here the moment any field carried padding or a duplicate. Soul's tamper loop is the evidence: C# accepted a duplicated protocol id, a padded generation and a padded Odin key id against the committed vector's own signature, and TypeScript refused all three. The test now reruns those, plus a padded protocol id, a blank one, a reversed list, a padded endpoint and a padded provider key id, against the C#-written vector's signature. A padded Odin key id must also find its root, so the trust map keys on the trimmed id as the C# dictionary does. `verseId` is left alone on purpose: it is not a route field, and `CanonicalRoute` passes the caller's string into `Canonical` untrimmed. The test pins that too. `protocolId ?? "cultmesh.documents.v1"` is gone. A C# route with no protocol ids is `Array.Empty()` and transcribes as the empty string; reading the handshake's `protocolId` as a one-element list wrote bytes the reference never writes. `canonicalSession` matches its C# counterpart the other way: it cleans nothing on the request, because the handshake message is what the wire carried, and only the endpoint is cleaned, because the one C# passes is `Route.Endpoint`. Mutations: the dedupe removed, the blank-id filter removed, the generation trim removed, the provider key id trim removed, and the Odin key id trim removed from the lookup -- each killed by its test. Co-Authored-By: Claude Fable 5.1 --- packages/cultnet-ts/src/cultmesh-authority.ts | 96 +++++++++++++++---- .../test/cultmesh-authority.test.ts | 53 +++++++++- scripts/mutate-cultmesh-authority.mjs | 49 +++++++--- 3 files changed, 166 insertions(+), 32 deletions(-) diff --git a/packages/cultnet-ts/src/cultmesh-authority.ts b/packages/cultnet-ts/src/cultmesh-authority.ts index f3a9121d..9e28bad7 100644 --- a/packages/cultnet-ts/src/cultmesh-authority.ts +++ b/packages/cultnet-ts/src/cultmesh-authority.ts @@ -103,8 +103,9 @@ export async function verifyAuthorityRoute( if (!isProtectedEndpoint(route.endpoint) && !(trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint))) { throw new Error("Authenticated remote CultMesh routes require TLS or QUIC channel protection."); } - const root = roots.get(certificate.odinKeyId); - if (!root) throw new Error(`Odin key '${certificate.odinKeyId}' is not trusted by this consumer.`); + const odinKeyId = certificateOdinKeyId(certificate); + const root = roots.get(odinKeyId); + if (!root) throw new Error(`Odin key '${odinKeyId}' is not trusted by this consumer.`); const now = trust.now?.() ?? Date.now(); if (now < certificate.issuedAtUnixMilliseconds || now >= certificate.expiresAtUnixMilliseconds) { throw new Error("The Odin route certificate is not currently valid."); @@ -132,11 +133,15 @@ export async function verifyAuthorityRoute( // The C# policy is a dictionary keyed by Odin key id and its constructor // throws on a duplicate. A TypeScript policy is a plain object, so the same // refusal happens at the first use of the policy, before any route is judged. +// The key is `CultMeshEcdsaP256PublicKey.KeyId`, which `Require` already +// trimmed, so two roots whose ids differ only in padding are one duplicate here +// too, and a padded certificate id still finds its root. function trustedOdinRoots(trust: CultMeshAuthorityTrustPolicy): Map { const roots = new Map(); for (const root of trust.odinRoots ?? []) { - if (roots.has(root.keyId)) throw new Error(`Odin root key id '${root.keyId}' is listed more than once in the trust policy.`); - roots.set(root.keyId, root); + const keyId = requireNonEmptyCSharp(root.keyId, "keyId"); + if (roots.has(keyId)) throw new Error(`Odin root key id '${keyId}' is listed more than once in the trust policy.`); + roots.set(keyId, root); } return roots; } @@ -151,36 +156,87 @@ export function verifyProviderSessionProof( return verifyP256(providerKey, canonicalSession(request, endpoint), signatureBase64); } +/** + * `CultMeshAuthorityRoute.Clean`: trim each protocol id, drop the blank ones, + * keep one of each ordinally, and sort ordinally. JavaScript's default sort is + * UTF-16 code-unit order, which is what `StringComparer.Ordinal` compares. + * + * A route that lists no protocol ids at all is `Array.Empty()` in C# + * and transcribes as the empty string, so there is no substitute id here: the + * TypeScript route view carries a separate `protocolId` for the handshake, and + * reading it as a one-element list would transcribe bytes the reference never + * writes. + */ +function cleanProtocolIds(values: readonly string[] | undefined): string[] { + return [...new Set((values ?? []).filter(value => !isNullOrWhiteSpaceCSharp(value)).map(trimCSharp))].sort(); +} + +/** `RequireNonEmpty` and `Require` in the C# reference: one refusal, one trimmed value. */ +function requireNonEmptyCSharp(value: string | undefined, parameterName: string): string { + if (isNullOrWhiteSpaceCSharp(value)) throw new Error(`Value must be non-empty. (Parameter '${parameterName}')`); + return trimCSharp(value!); +} + +/** `CultMeshRouteCertificate`: the Odin key identity is required, and trimmed. */ +function certificateOdinKeyId(certificate: CultMeshAuthorityRouteCertificate): string { + if (isNullOrWhiteSpaceCSharp(certificate.odinKeyId)) { + throw new Error("Odin key identity is required. (Parameter 'odinKeyId')"); + } + return trimCSharp(certificate.odinKeyId); +} + +/** + * The transcript the C# reference signs is over a *constructed* route, and the + * C# constructors clean every field on the way in. Cleaning at the transcript + * is where TypeScript gets the same bytes: a duplicated protocol id, a padded + * protocol id, a padded generation and a padded Odin key id all verify against + * a C#-written signature, because C# never saw the padding either. + * + * `verseId` is the exception. It is not a route field: `CanonicalRoute` passes + * the caller's string straight into `Canonical`, untrimmed, so padding it + * changes the bytes on both sides. + */ export function canonicalRoute(route: CultMeshAuthorityRouteView): Uint8Array { const certificate = route.certificate!; + const authorityRuntimeId = requireNonEmptyCSharp(route.authorityRuntimeId, "authorityRuntimeId"); + const endpoint = requireNonEmptyCSharp(route.endpoint, "endpoint"); return canonicalFields( "gamecult.cultmesh.route-certificate.v1", route.verseId, - route.authorityRuntimeId, - route.endpoint, - [...(route.protocolIds ?? [route.protocolId ?? "cultmesh.documents.v1"])].sort().join(""), + authorityRuntimeId, + endpoint, + cleanProtocolIds(route.protocolIds).join(""), String(route.priority ?? 0), - route.generation, - certificate.providerKey.keyId, - certificate.providerKey.x, - certificate.providerKey.y, - certificate.odinKeyId, + // A blank generation is not blank in C#: the route constructor substitutes + // the runtime id and endpoint, already cleaned, joined by "@". + isNullOrWhiteSpaceCSharp(route.generation) ? `${authorityRuntimeId}@${endpoint}` : trimCSharp(route.generation), + requireNonEmptyCSharp(certificate.providerKey.keyId, "keyId"), + requireNonEmptyCSharp(certificate.providerKey.x, "x"), + requireNonEmptyCSharp(certificate.providerKey.y, "y"), + certificateOdinKeyId(certificate), String(certificate.issuedAtUnixMilliseconds), String(certificate.expiresAtUnixMilliseconds), ); } +/** + * `CanonicalSession` cleans nothing on the request: it substitutes the empty + * string for a null field and trims none of them, because the handshake message + * is what the wire carried, not a constructed route. The endpoint is the only + * cleaned field, because the one C# passes is `Route.Endpoint`, which the route + * constructor already required non-empty and trimmed. + */ export function canonicalSession(request: CultMeshSessionOpenMessage, endpoint: string): Uint8Array { return canonicalFields( "gamecult.cultmesh.session-proof.v1", - request.clientNonce, - request.messageId, - request.sourceRuntimeId, - request.verseId, - request.authorityRuntimeId, - request.protocolId, - endpoint, - request.routeGeneration, + request.clientNonce ?? "", + request.messageId ?? "", + request.sourceRuntimeId ?? "", + request.verseId ?? "", + request.authorityRuntimeId ?? "", + request.protocolId ?? "", + requireNonEmptyCSharp(endpoint, "endpoint"), + request.routeGeneration ?? "", ); } diff --git a/packages/cultnet-ts/test/cultmesh-authority.test.ts b/packages/cultnet-ts/test/cultmesh-authority.test.ts index b8fc2509..a0820628 100644 --- a/packages/cultnet-ts/test/cultmesh-authority.test.ts +++ b/packages/cultnet-ts/test/cultmesh-authority.test.ts @@ -383,7 +383,9 @@ for (const [label, path] of [["C# reference", VECTORS_PATH], ["TypeScript-signed await verifyAuthorityRoute(vectors.route, trust); await assert.rejects(verifyAuthorityRoute({ ...vectors.route, priority: 8 }, trust), /signature is invalid/); await assert.rejects( - verifyAuthorityRoute({ ...vectors.route, protocolIds: [...vectors.route.protocolIds!, "cultmesh.realtime.v1"] }, trust), + // An id the vector does not already list: one it does list would be a + // duplicate, and the C# `Clean` drops duplicates before the transcript. + verifyAuthorityRoute({ ...vectors.route, protocolIds: [...vectors.route.protocolIds!, "cultmesh.telemetry.v1"] }, trust), /signature is invalid/, ); @@ -399,6 +401,55 @@ for (const [label, path] of [["C# reference", VECTORS_PATH], ["TypeScript-signed ); }); +// Soul ran each of these against the C# reference on 2026-09-16 by tampering +// with the committed vector and rerunning the C# test: C# accepted every one, +// because its constructors clean the field before `CanonicalRoute` sees it. +// TypeScript refused every one until it cleaned at the transcript too. The +// signature here is the C#-written one; nothing is re-signed. +test("padding and duplication the C# constructors clean still verify against the C#-written vector", async () => { + const vectors = JSON.parse(readFileSync(VECTORS_PATH, "utf8")) as Vectors; + const trust = { mode: "authenticated-remote" as const, odinRoots: [vectors.odinRoot], now: () => vectors.nowUnixMilliseconds }; + const route = vectors.route; + const certificate = route.certificate!; + const protocolIds = route.protocolIds!; + const accepted: readonly (readonly [string, CultMeshAuthorityRouteView])[] = [ + ["a duplicated protocol id", { ...route, protocolIds: [...protocolIds, protocolIds[0]!] }], + ["a padded protocol id", { ...route, protocolIds: [` ${protocolIds[0]!}…`, ...protocolIds.slice(1)] }], + ["a blank protocol id", { ...route, protocolIds: [...protocolIds, " "] }], + ["the protocol ids reversed", { ...route, protocolIds: [...protocolIds].reverse() }], + ["a padded generation", { ...route, generation: ` ${route.generation} ` }], + ["a padded endpoint", { ...route, endpoint: ` ${route.endpoint} ` }], + ["a padded Odin key id", { ...route, certificate: { ...certificate, odinKeyId: ` ${certificate.odinKeyId} ` } }], + ["a padded provider key id", { + ...route, + certificate: { ...certificate, providerKey: { ...certificate.providerKey, keyId: ` ${certificate.providerKey.keyId} ` } }, + }], + ]; + for (const [label, candidate] of accepted) { + await verifyAuthorityRoute(candidate, trust).catch((error: Error) => { + assert.fail(`${label} should verify as it does in C#, but: ${error.message}`); + }); + } + // A padded Odin key id also has to find its root, as it does in the C# + // dictionary, whose keys `Require` already trimmed. + await verifyAuthorityRoute( + { ...route, certificate: { ...certificate, odinKeyId: ` ${certificate.odinKeyId} ` } }, + { ...trust, odinRoots: [{ ...vectors.odinRoot, keyId: `\t${vectors.odinRoot.keyId}\t` }] }, + ); + + // `verseId` is not a route field and C# does not clean it, so padding it + // changes the bytes on both sides. + await assert.rejects(verifyAuthorityRoute({ ...route, verseId: ` ${route.verseId} ` }, trust), /signature is invalid/); + // A route with no protocol ids transcribes the empty string, as C#'s + // `Array.Empty()` does; there is no substituted default id. + await assert.rejects(verifyAuthorityRoute({ ...route, protocolIds: undefined }, trust), /signature is invalid/); + await assert.rejects(verifyAuthorityRoute({ ...route, protocolIds: [] }, trust), /signature is invalid/); + assert.deepEqual( + canonicalRoute({ ...route, protocolIds: undefined }), + canonicalRoute({ ...route, protocolIds: ["", " "] }), + ); +}); + test("the shared module keeps the browser-safe surface: no node: import", () => { const source = readFileSync(join(__dirname, "..", "..", "src", "cultmesh-authority.ts"), "utf8"); assert.doesNotMatch(source, /from "node:|require\("node:/); diff --git a/scripts/mutate-cultmesh-authority.mjs b/scripts/mutate-cultmesh-authority.mjs index 176c7f7f..1e86133a 100644 --- a/scripts/mutate-cultmesh-authority.mjs +++ b/scripts/mutate-cultmesh-authority.mjs @@ -54,7 +54,7 @@ const mutations = [ }, { rule: "Odin root lookup by key id", - old: "const root = roots.get(certificate.odinKeyId);", + old: "const root = roots.get(odinKeyId);", new: "const root = [...roots.values()][0];", }, { @@ -90,8 +90,9 @@ const mutations = [ }, { rule: "root lookup precedes the validity window", - old: " const root = roots.get(certificate.odinKeyId);\n" + - " if (!root) throw new Error(`Odin key '${certificate.odinKeyId}' is not trusted by this consumer.`);\n" + + old: " const odinKeyId = certificateOdinKeyId(certificate);\n" + + " const root = roots.get(odinKeyId);\n" + + " if (!root) throw new Error(`Odin key '${odinKeyId}' is not trusted by this consumer.`);\n" + " const now = trust.now?.() ?? Date.now();\n" + " if (now < certificate.issuedAtUnixMilliseconds || now >= certificate.expiresAtUnixMilliseconds) {\n" + ' throw new Error("The Odin route certificate is not currently valid.");\n' + @@ -100,18 +101,19 @@ const mutations = [ " if (now < certificate.issuedAtUnixMilliseconds || now >= certificate.expiresAtUnixMilliseconds) {\n" + ' throw new Error("The Odin route certificate is not currently valid.");\n' + " }\n" + - " const root = roots.get(certificate.odinKeyId);\n" + - " if (!root) throw new Error(`Odin key '${certificate.odinKeyId}' is not trusted by this consumer.`);\n", + " const odinKeyId = certificateOdinKeyId(certificate);\n" + + " const root = roots.get(odinKeyId);\n" + + " if (!root) throw new Error(`Odin key '${odinKeyId}' is not trusted by this consumer.`);\n", }, { rule: "duplicate Odin root key ids refuse the policy", - old: " if (roots.has(root.keyId)) throw new Error(`Odin root key id '${root.keyId}' is listed more than once in the trust policy.`);\n", + old: " if (roots.has(keyId)) throw new Error(`Odin root key id '${keyId}' is listed more than once in the trust policy.`);\n", new: "", }, { rule: "protocol ids are sorted into the transcript", - old: "].sort().join(", - new: "].join(", + old: ")].sort();", + new: ")];", }, { rule: "verifyP256 copies the viewed payload bytes, not the pool behind a Buffer", @@ -120,14 +122,39 @@ const mutations = [ }, { rule: "route transcript field order", - old: " route.verseId,\n route.authorityRuntimeId,\n", - new: " route.authorityRuntimeId,\n route.verseId,\n", + old: " route.verseId,\n authorityRuntimeId,\n", + new: " authorityRuntimeId,\n route.verseId,\n", }, { rule: "session transcript binds the nonce", - old: " request.clientNonce,\n", + old: ' request.clientNonce ?? "",\n', new: "", }, + { + rule: "protocol ids are deduplicated into the transcript", + old: " return [...new Set(", + new: " return [...(", + }, + { + rule: "the generation is trimmed into the transcript", + old: ": trimCSharp(route.generation),", + new: ": route.generation,", + }, + { + rule: "the provider key id is trimmed into the transcript", + old: ' requireNonEmptyCSharp(certificate.providerKey.keyId, "keyId"),', + new: " certificate.providerKey.keyId,", + }, + { + rule: "the Odin key id is trimmed before the root lookup", + old: " const odinKeyId = certificateOdinKeyId(certificate);", + new: " const odinKeyId = certificate.odinKeyId;", + }, + { + rule: "blank protocol ids are dropped from the transcript", + old: "(values ?? []).filter(value => !isNullOrWhiteSpaceCSharp(value)).map(trimCSharp)", + new: "(values ?? []).map(trimCSharp)", + }, { rule: "length-prefix framing is big-endian", old: "view.setUint32(offset, value.byteLength, false);", From 803ee12a7a050c890b52cf0d77712522d2ec79ca Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 17:22:06 +0200 Subject: [PATCH 40/94] Refuse the endpoint spellings WHATWG URL repairs and System.Uri does not `isLoopbackEndpoint` handed the raw endpoint to `URL` and read the host it got back. `URL` is a repairing parser and `System.Uri` is not, so seven spellings were loopback here and remote in C#: a trailing dot on the host, which `URL` drops; `ws:127.0.0.1`, `ws:/127.0.0.1` and `ws:///127.0.0.1`, whose authority `URL` infers; a backslash path separator, which `URL` reads as a separator; fullwidth digits and letters in the host, which `URL` folds to ASCII; and a tab in the host, which `URL` deletes. Each of those is a local-development bypass: a route the C# consumer would have demanded a certificate for opened unsigned here. `refusedByCSharpUriShape` refuses exactly those, on the raw string, before `URL` sees it. Leading and trailing C0 controls and spaces around the whole endpoint are stripped first, because both sides accept them. The spellings Hands probed earlier and C# accepts -- `127.1`, hex, decimal, `[::FFFF:7F00:1]`, userinfo, `localhost:8443` -- are untouched. The doc comment claimed equivalence with `System.Uri.IsLoopback`. It is not equivalent and now says so: two divergences remain, both unreachable from a browser CultMesh route, and both named. An IPv6 zone id throws in `URL` and is a host-local interface name no browser socket can dial; `file:` and `mailto:` have no `URL` host and are refused by `openSocket`, which takes `ws:` and `wss:` only. The test is Soul's endpoint list with the C# answer as the expectation: 82 of the 88 it probed, the six unreachable ones named in the doc comment instead. Mutations: the trailing-dot refusal dropped, the scheme-and-authority shape inverted, the backslash refusal dropped, and the non-ASCII host refusal dropped -- each killed by the table. Co-Authored-By: Claude Fable 5.1 --- packages/cultnet-ts/src/cultmesh-authority.ts | 47 +++++++ .../test/cultmesh-authority.test.ts | 127 +++++++++++++++--- scripts/mutate-cultmesh-authority.mjs | 20 +++ 3 files changed, 172 insertions(+), 22 deletions(-) diff --git a/packages/cultnet-ts/src/cultmesh-authority.ts b/packages/cultnet-ts/src/cultmesh-authority.ts index 9e28bad7..c5fd2c5b 100644 --- a/packages/cultnet-ts/src/cultmesh-authority.ts +++ b/packages/cultnet-ts/src/cultmesh-authority.ts @@ -296,6 +296,40 @@ function ownedBytes(view: Uint8Array): ArrayBuffer { return view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength) as ArrayBuffer; } +/** + * `System.Uri` refuses spellings that WHATWG `URL` repairs, and a repaired + * spelling would be loopback here and not in C#. This is that refusal, on the + * raw string, before `URL` sees it: the scheme must be followed by `//` and a + * non-empty authority, the string carries no backslash, and the host is ASCII, + * free of whitespace, and does not end in a dot. + * + * Each clause answers one spelling Soul found `System.Uri` refusing and `URL` + * accepting on 2026-09-16: `ws://127.0.0.1.` (the trailing dot, which `URL` + * drops), `ws:127.0.0.1`, `ws:/127.0.0.1` and `ws:///127.0.0.1` (the missing or + * empty authority, which `URL` infers), `ws://127.0.0.1\mesh` (the backslash, + * which `URL` reads as a path separator), `ws://127.0.0.1` and + * `ws://localhost` (fullwidth forms, which `URL` folds to ASCII), and + * `ws://localhost\t/mesh` (the tab, which `URL` deletes). + * + * Leading and trailing C0 control characters and spaces around the whole + * endpoint are stripped first, because `URL` strips them and `System.Uri` + * accepts them: " ws://127.0.0.1/mesh" is loopback to both. + */ +function refusedByCSharpUriShape(value: string): boolean { + const raw = value.replace(/^[- ]+|[- ]+$/g, ""); + if (raw.includes("\\")) return true; + const shape = /^[A-Za-z][A-Za-z0-9+\-.]*:\/\/([^/?#]+)/.exec(raw); + if (!shape) return true; + const authority = shape[1]!; + const afterUserInfo = authority.slice(authority.lastIndexOf("@") + 1); + const host = afterUserInfo.startsWith("[") + ? afterUserInfo.slice(0, afterUserInfo.indexOf("]") + 1) + : afterUserInfo.split(":")[0]!; + if (host.length === 0) return true; + // eslint-disable-next-line no-control-regex + return /[^!-~]/.test(host) || host.endsWith("."); +} + /** * The C# rule (`CultMeshAuthorityProof.cs`, `IsLoopback`): `System.Uri.IsLoopback`, * which is any `127.0.0.0/8` IPv4 host, `::1`, the IPv4-mapped `::ffff:127.0.0.1` @@ -303,8 +337,21 @@ function ownedBytes(view: Uint8Array): ArrayBuffer { * WHATWG `URL` already normalises `127.1`, `0x7f000001` and `2130706433` to * `127.0.0.1` and serialises the mapped form as `::ffff:7f00:1`, as `System.Uri` * does on its side. `localhost.` is not loopback on either side. + * + * This is not `System.Uri.IsLoopback`, and the spellings where it still differs + * are named rather than claimed away. `URL` repairs seven spellings `System.Uri` + * refuses, and `refusedByCSharpUriShape` refuses those first. Two divergences + * remain, both unreachable from a browser CultMesh route: + * + * - An IPv6 zone id (`ws://[::1%eth0]`, `%25`-escaped or not) is loopback to + * `System.Uri` and throws in `URL`, so this answers false. A zone id is a + * host-local interface name; it cannot be dialled from a browser socket. + * - `file://localhost/mesh` and `mailto:localhost` are loopback to `System.Uri` + * and have no host in `URL`, so this answers false. Neither is a CultMesh + * route: `openSocket` refuses any scheme but `ws:` and `wss:`. */ export function isLoopbackEndpoint(value: string): boolean { + if (refusedByCSharpUriShape(value)) return false; try { const host = new URL(value).hostname.replace(/^\[|\]$/g, "").toLowerCase(); return host === "localhost" || host === "loopback" || host === "::1" || host === "::ffff:7f00:1" || diff --git a/packages/cultnet-ts/test/cultmesh-authority.test.ts b/packages/cultnet-ts/test/cultmesh-authority.test.ts index a0820628..f5e61b80 100644 --- a/packages/cultnet-ts/test/cultmesh-authority.test.ts +++ b/packages/cultnet-ts/test/cultmesh-authority.test.ts @@ -311,22 +311,105 @@ test("isProtectedEndpoint is the C# rule: wss, https, or any scheme containing q } }); -// The accepted and refused hosts here are what `System.Uri.IsLoopback` answered -// through `CultMeshAuthorityTrustPolicy` on 2026-09-16; keep them in step. -test("isLoopbackEndpoint is the C# System.Uri.IsLoopback set", () => { - for (const loopback of [ - "ws://localhost:4050/mesh", "wss://LOCALHOST/mesh", "ws://loopback:4050/mesh", "ws://LoopBack:4050/mesh", - "ws://127.0.0.1:4050/mesh", "ws://127.0.0.2/mesh", "ws://127.255.255.254/mesh", "ws://127.1/mesh", "ws://0x7f000001/mesh", "ws://2130706433/mesh", - "ws://[::1]:4050/mesh", "ws://[0:0:0:0:0:0:0:1]:4050/mesh", "ws://[::ffff:127.0.0.1]/mesh", "ws://[::ffff:7f00:1]/mesh", - ]) { - assert.equal(isLoopbackEndpoint(loopback), true, loopback); - } - for (const remote of [ - "ws://192.0.2.10:4050/mesh", "wss://provider.example/mesh", "ws://[::ffff:127.0.0.2]/mesh", "ws://localhost./mesh", - "ws://localhost.localdomain/mesh", "ws://127.example/mesh", "ws://0.0.0.0/mesh", "ws://[::]/mesh", "not a url", - ]) { - assert.equal(isLoopbackEndpoint(remote), false, remote); +// Every endpoint Soul put to both sides on 2026-09-16, with the answer +// `System.Uri.IsLoopback` gave through `CultMeshAuthorityTrustPolicy` as the +// expectation. Six of the probe's 88 are left out and named in the doc comment +// on `isLoopbackEndpoint` instead, because they are unreachable as browser +// CultMesh routes: the four IPv6 zone-id spellings, `file://localhost/mesh` +// and `mailto:localhost`. +const CSHARP_LOOPBACK_ANSWERS: readonly (readonly [string, boolean])[] = [ + ["ws://127.0.0.1:4050/mesh", true], + ["ws://127.0.0.2:4050/mesh", true], + ["ws://127.255.255.254:4050/mesh", true], + ["ws://127.1:4050/mesh", true], + ["ws://0x7f000001:4050/mesh", true], + ["ws://2130706433:4050/mesh", true], + ["ws://[::1]:4050/mesh", true], + ["ws://[0:0:0:0:0:0:0:1]:4050/mesh", true], + ["ws://[::ffff:127.0.0.1]:4050/mesh", true], + ["ws://[::ffff:7f00:1]:4050/mesh", true], + ["ws://[::ffff:127.0.0.2]:4050/mesh", false], + ["ws://localhost:4050/mesh", true], + ["ws://LOCALHOST:4050/mesh", true], + ["ws://loopback:4050/mesh", true], + ["ws://LoopBack:4050/mesh", true], + ["ws://localhost.:4050/mesh", false], + ["ws://localhost.localdomain:4050/mesh", false], + ["ws://0.0.0.0:4050/mesh", false], + ["ws://[::]:4050/mesh", false], + ["ws://192.0.2.10:4050/mesh", false], + ["ws://provider.example:4050/mesh", false], + ["ws://127.0.0.1.:4050/mesh", false], + ["ws://127.0.0.1.", false], + ["ws://[::FFFF:127.0.0.1]:4050/mesh", true], + ["ws://[::FFFF:7F00:1]:4050/mesh", true], + ["ws://0177.0.0.1:4050/mesh", true], + ["ws://0177.0.0.1", true], + ["ws://127.0.0.1:0", true], + ["ws://127.0.0.1:0/mesh", true], + ["ws://LOCALHOST", true], + ["ws://localhost:8443", true], + ["ws://localhost:8443/", true], + ["ws://localhost:8443/mesh/path", true], + ["wss://[::1]/mesh", true], + ["wss://[fe80::1]/mesh", false], + ["wss://[::1]:8443", true], + ["ws://[::FFFF:7F00:1]", true], + ["ws://user:pw@127.0.0.1:4050/mesh", true], + ["ws://user@localhost/mesh", true], + ["ws://user:pw@provider.example/mesh", false], + ["ws://127.0.0.1@provider.example/mesh", false], + ["ws://provider.example@127.0.0.1/mesh", true], + ["ws://127.00.0.1/mesh", true], + ["ws://127.0.0.256/mesh", false], + ["ws://127.0.1/mesh", true], + ["ws://127/mesh", false], + ["ws://0x7F.0.0.1/mesh", true], + ["ws://127.0.0.01/mesh", true], + ["ws://LOCALHOST./mesh", false], + ["ws://[::0:1]/mesh", true], + ["ws://[0::1]/mesh", true], + ["ws://[::ffff:0:7f00:1]/mesh", false], + ["ws://[64:ff9b::7f00:1]/mesh", false], + ["ws://127.0.0.1%20/mesh", false], + ["ws://localhost%20/mesh", false], + ["ws://127.0.0.1 /mesh", false], + ["ws://loopback./mesh", false], + ["ws:127.0.0.1/mesh", false], + ["ws:/127.0.0.1/mesh", false], + ["ws:///127.0.0.1/mesh", false], + ["WS://127.0.0.1/mesh", true], + ["ws://127.0.0.1", true], + ["ws://127.0.0.1/", true], + ["ws://127.0.0.1?x=1", true], + ["ws://127.0.0.1#f", true], + ["ws://[::1]", true], + ["ws://[::1]/", true], + ["ws://localhost.localhost/mesh", false], + ["ws://localhost/../mesh", true], + ["ws://127.0.0.1\\mesh", false], + ["ws://127.0.0.1/mesh\n", true], + [" ws://127.0.0.1/mesh", true], + ["ws://127.0.0.1/mesh ", true], + ["ws://127.0.0.1/mesh", false], + ["ws://localhost/mesh", false], + ["ws://localhost\t/mesh", false], + ["ws://[::ffff:127.0.0.1]", true], + ["ws://[::ffff:7f00:0001]/mesh", true], + ["ws://[0:0:0:0:0:ffff:7f00:1]/mesh", true], + ["http://127.0.0.1/mesh", true], + ["cultmesh-state+quic://127.0.0.1:4433/", true], + ["ws://127.0.0.1:99999/mesh", false], +]; + +test("isLoopbackEndpoint answers as System.Uri.IsLoopback did, over every reachable endpoint Soul probed", () => { + assert.equal(CSHARP_LOOPBACK_ANSWERS.length, 82); + const disagreements: string[] = []; + for (const [endpoint, csharp] of CSHARP_LOOPBACK_ANSWERS) { + if (isLoopbackEndpoint(endpoint) !== csharp) disagreements.push(`${JSON.stringify(endpoint)} (C# said ${csharp})`); } + assert.deepEqual(disagreements, []); + assert.equal(isLoopbackEndpoint("not a url"), false); }); // `char.IsWhiteSpace` as .NET 10 answered for each of these code points on @@ -366,10 +449,10 @@ test("the whitespace set is C#'s char.IsWhiteSpace, not String.prototype.trim", } } // The two code points where `trim` would have answered differently. - assert.equal("…".trim().length, 1); - assert.equal(isCSharpWhiteSpace("…"), true); - assert.equal("".trim().length, 0); - assert.equal(isCSharpWhiteSpace(""), false); + assert.equal("\u0085".trim().length, 1); + assert.equal(isCSharpWhiteSpace("\u0085"), true); + assert.equal("\ufeff".trim().length, 0); + assert.equal(isCSharpWhiteSpace("\ufeff"), false); }); test("base64 helpers round-trip across the 32 KiB chunk boundary", () => { @@ -414,12 +497,12 @@ test("padding and duplication the C# constructors clean still verify against the const protocolIds = route.protocolIds!; const accepted: readonly (readonly [string, CultMeshAuthorityRouteView])[] = [ ["a duplicated protocol id", { ...route, protocolIds: [...protocolIds, protocolIds[0]!] }], - ["a padded protocol id", { ...route, protocolIds: [` ${protocolIds[0]!}…`, ...protocolIds.slice(1)] }], + ["a padded protocol id", { ...route, protocolIds: [` ${protocolIds[0]!}\u0085`, ...protocolIds.slice(1)] }], ["a blank protocol id", { ...route, protocolIds: [...protocolIds, " "] }], ["the protocol ids reversed", { ...route, protocolIds: [...protocolIds].reverse() }], - ["a padded generation", { ...route, generation: ` ${route.generation} ` }], + ["a padded generation", { ...route, generation: ` ${route.generation}\u3000` }], ["a padded endpoint", { ...route, endpoint: ` ${route.endpoint} ` }], - ["a padded Odin key id", { ...route, certificate: { ...certificate, odinKeyId: ` ${certificate.odinKeyId} ` } }], + ["a padded Odin key id", { ...route, certificate: { ...certificate, odinKeyId: `\u00a0${certificate.odinKeyId} ` } }], ["a padded provider key id", { ...route, certificate: { ...certificate, providerKey: { ...certificate.providerKey, keyId: ` ${certificate.providerKey.keyId} ` } }, diff --git a/scripts/mutate-cultmesh-authority.mjs b/scripts/mutate-cultmesh-authority.mjs index 1e86133a..25c289ab 100644 --- a/scripts/mutate-cultmesh-authority.mjs +++ b/scripts/mutate-cultmesh-authority.mjs @@ -188,6 +188,26 @@ const mutations = [ old: 'host === "::ffff:7f00:1" ||', new: "", }, + { + rule: "a trailing dot on the host is refused, as System.Uri refuses it", + old: ' || host.endsWith(".");', + new: ";", + }, + { + rule: "a scheme not followed by // and an authority is refused", + old: " if (!shape) return true;", + new: " if (!shape) return false;", + }, + { + rule: "a backslash in the endpoint is refused", + old: ' if (raw.includes("\\\\")) return true;\n', + new: "", + }, + { + rule: "a non-ASCII host is refused, so URL cannot fold a fullwidth form to ASCII", + old: " return /[^\\u0021-\\u007e]/.test(host)", + new: " return false", + }, { rule: "protected scheme: any scheme containing quic", old: 'scheme.includes("quic")', From dfe582edbc8f107b62d30238724327b25e32b25a Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 17:39:50 +0200 Subject: [PATCH 41/94] Kill the browser's local reading of "unsigned", and mutate the browser too Soul replaced the shared `isUnsignedCertificate` call in the browser's session-acceptance check with a local empty-string comparison and every one of the 18 browser tests still passed, because every test used an empty signature. A whitespace signature is where the two readings part: the shared route verifier accepts such a route as unsigned on a loopback local-development endpoint, and an inline comparison then demands a provider proof for the session the verifier just let through. The test now opens that session with three spaces, U+0085 and a no-break-space/tab/newline mix as well as the empty string, and asserts U+FEFF the other way, since it is whitespace to JavaScript and a signature to C#. The mutation runner grew a second target. `shared` is the one verifier, killed by the cultnet-ts tests; `browser` is `packages/cultmesh-browser/src/index.ts`, killed by the browser tests. A browser mutation cannot be killed by cultnet-ts tests, so the killer is the target's own workspace, and each target carries its own sidecar, control, sentinel and post-restore dist assertion. Two repairs this pass earned: - The sidecar is now removed inside the `finally`, right after the verified restore. A throw mid-run left it behind holding the pre-run bytes, and the next run "repaired" the file from them, silently reverting everything fixed in between. That happened here, twice, before it was noticed. - The NUL in the loopback pre-check's strip regex had been written as a literal byte rather than an escape. It read the same, but git classified the file as binary and stopped normalising its line endings, so the whole file diffed as rewritten. Escaped, along with the ASCII host range beside it. Co-Authored-By: Claude Fable 5.1 --- .../test/cultmesh-browser.test.ts | 45 ++-- packages/cultnet-ts/src/cultmesh-authority.ts | 4 +- scripts/mutate-cultmesh-authority.mjs | 201 +++++++++++------- 3 files changed, 156 insertions(+), 94 deletions(-) diff --git a/packages/cultmesh-browser/test/cultmesh-browser.test.ts b/packages/cultmesh-browser/test/cultmesh-browser.test.ts index 77237bb9..59f9fac1 100644 --- a/packages/cultmesh-browser/test/cultmesh-browser.test.ts +++ b/packages/cultmesh-browser/test/cultmesh-browser.test.ts @@ -245,26 +245,43 @@ test("browser client opens an unsigned-certificate loopback session under local- trust, socketFactory: () => handshakeOnlySocket(route), }); - const blank = (route: CultMeshBrowserRoute) => ({ ...route, certificate: { ...route.certificate!, signature: "" } }); + const blank = (route: CultMeshBrowserRoute, signature: string) => + ({ ...route, certificate: { ...route.certificate!, signature } }); const loopback = await createSignedRoute("ws://127.0.0.1:4501/mesh"); const localTrust = { mode: "local-development" as const, odinRoots: [loopback.odinPublic] }; - const client = await connect(blank(loopback.route), localTrust); - assert.equal(client.state, "connected"); - await client.dispose(); + const remote = await createSignedRoute("wss://provider.example/mesh"); + + // Empty is the easy case. The whitespace signatures are the ones that catch a + // local re-reading of "unsigned" here: an inline `signature === ""` passes + // every other test in this file and fails these, and U+0085 also separates + // `String.prototype.trim` from the C# `char.IsWhiteSpace` the shared + // `isUnsignedCertificate` uses. Both sides of the session check have to read + // "unsigned" the same way, or the route verifier accepts a session the + // acceptance check then demands a provider proof for. + for (const signature of ["", " ", "\u0085", "\u00a0\t\n"]) { + const label = JSON.stringify(signature); + const client = await connect(blank(loopback.route, signature), localTrust); + assert.equal(client.state, "connected", label); + await client.dispose(); + await assert.rejects( + connect(blank(remote.route, signature), { mode: "local-development", odinRoots: [remote.odinPublic] }), + /Odin-signed authority certificate/, + label, + ); + await assert.rejects( + connect(blank(remote.route, signature), { mode: "authenticated-remote", odinRoots: [remote.odinPublic] }), + /Odin-signed authority certificate/, + label, + ); + } + // U+FEFF is whitespace to JavaScript and not to C#, so it is a signature, not + // an unsigned route, and the loopback route is refused for its bytes. + await assert.rejects(connect(blank(loopback.route, "\ufeff"), localTrust), /not base64|not IEEE P1363/); + // A signed loopback certificate is an authenticated route even under // local-development; the provider must still prove its key. await assert.rejects(connect(loopback.route, localTrust), /did not prove possession/); - - const remote = await createSignedRoute("wss://provider.example/mesh"); - await assert.rejects( - connect(blank(remote.route), { mode: "local-development", odinRoots: [remote.odinPublic] }), - /Odin-signed authority certificate/, - ); - await assert.rejects( - connect(blank(remote.route), { mode: "authenticated-remote", odinRoots: [remote.odinPublic] }), - /Odin-signed authority certificate/, - ); }); test("browser client rejects a mutated or expired signed route before opening a provider socket", async () => { diff --git a/packages/cultnet-ts/src/cultmesh-authority.ts b/packages/cultnet-ts/src/cultmesh-authority.ts index c5fd2c5b..b9681c71 100644 --- a/packages/cultnet-ts/src/cultmesh-authority.ts +++ b/packages/cultnet-ts/src/cultmesh-authority.ts @@ -316,7 +316,7 @@ function ownedBytes(view: Uint8Array): ArrayBuffer { * accepts them: " ws://127.0.0.1/mesh" is loopback to both. */ function refusedByCSharpUriShape(value: string): boolean { - const raw = value.replace(/^[- ]+|[- ]+$/g, ""); + const raw = value.replace(/^[\u0000-\u0020]+|[\u0000-\u0020]+$/g, ""); if (raw.includes("\\")) return true; const shape = /^[A-Za-z][A-Za-z0-9+\-.]*:\/\/([^/?#]+)/.exec(raw); if (!shape) return true; @@ -327,7 +327,7 @@ function refusedByCSharpUriShape(value: string): boolean { : afterUserInfo.split(":")[0]!; if (host.length === 0) return true; // eslint-disable-next-line no-control-regex - return /[^!-~]/.test(host) || host.endsWith("."); + return /[^\u0021-\u007e]/.test(host) || host.endsWith("."); } /** diff --git a/scripts/mutate-cultmesh-authority.mjs b/scripts/mutate-cultmesh-authority.mjs index 25c289ab..92e4bf53 100644 --- a/scripts/mutate-cultmesh-authority.mjs +++ b/scripts/mutate-cultmesh-authority.mjs @@ -1,15 +1,23 @@ -// Mutation check for the shared CultMesh route verifier. +// Mutation check for the CultMesh route verification rules. // -// Each rule the cut map names for `packages/cultnet-ts/src/cultmesh-authority.ts` -// gets one mutation. A mutation is killed when `npm run test --workspace -// packages/cultnet-ts` fails with it applied; a survivor means no test pins that -// rule. The file is rewritten as UTF-8 bytes and restored from the original -// bytes with a digest check, never from git. A no-op control runs first through -// the same write path so a false kill from the write itself cannot hide. +// Two files own those rules and each is one target here. `shared` is +// `packages/cultnet-ts/src/cultmesh-authority.ts`, the one verifier, killed by +// `npm run test --workspace packages/cultnet-ts`. `browser` is +// `packages/cultmesh-browser/src/index.ts`, which must *call* the shared rules +// rather than re-read them locally, killed by `npm run test --workspace +// packages/cultmesh-browser`. A browser mutation cannot be killed by the +// cultnet-ts tests and a shared one is not the browser's to pin, so the killer +// is the target's own workspace. // -// The original bytes also live in `.mutation-original` from the first +// Each rule the cut map names gets one mutation. A survivor means no test pins +// that rule. Each file is rewritten as UTF-8 bytes and restored from the +// original bytes with a digest check, never from git. A no-op control runs +// first per target through the same write path so a false kill from the write +// itself cannot hide. +// +// The original bytes also live in `.mutation-original` from the first // write until a verified restore; a run killed mid-mutation is repaired from -// that sidecar by the next run, not by git. After the final restore the +// that sidecar by the next run, not by git. After the final restore each // package is rebuilt so `dist/` never carries the last mutant. // // node scripts/mutate-cultmesh-authority.mjs @@ -21,15 +29,27 @@ import { dirname, join, resolve } from "node:path"; import { fileURLToPath } from "node:url"; const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); -const target = join(repoRoot, "packages", "cultnet-ts", "src", "cultmesh-authority.ts"); -const sidecar = `${target}.mutation-original`; -const dist = join(repoRoot, "packages", "cultnet-ts", "dist", "cultmesh-authority.js"); const npmCli = process.env.npm_execpath ?? join(dirname(process.execPath), "node_modules", "npm", "bin", "npm-cli.js"); -// Present in the restored source and compiled verbatim into dist/; the last -// mutation in the list removes it, which is what makes the post-rebuild check -// distinguish a rebuilt dist/ from one still carrying that mutant. -const sentinel = 'scheme === "https"'; + +// Each target's `sentinel` is present in its restored source and compiled +// verbatim into its dist/; that target's last mutation removes it, which is +// what makes the post-rebuild check distinguish a rebuilt dist/ from one still +// carrying that mutant. +const targets = { + shared: { + workspace: "packages/cultnet-ts", + file: join(repoRoot, "packages", "cultnet-ts", "src", "cultmesh-authority.ts"), + dist: join(repoRoot, "packages", "cultnet-ts", "dist", "cultmesh-authority.js"), + sentinel: 'scheme === "https"', + }, + browser: { + workspace: "packages/cultmesh-browser", + file: join(repoRoot, "packages", "cultmesh-browser", "src", "index.ts"), + dist: join(repoRoot, "packages", "cultmesh-browser", "dist", "index.js"), + sentinel: "isUnsignedCertificate(route.certificate)", + }, +}; const mutations = [ { @@ -218,51 +238,38 @@ const mutations = [ old: 'scheme === "https" || ', new: "", }, + // The browser target. Its session-acceptance short-circuit must ask the + // shared module what "unsigned" means; a local re-reading here and the route + // verifier's reading there can drift apart, and a browser route that the + // verifier let through unsigned would then be asked for a provider proof. + { + target: "browser", + rule: "the session short-circuit calls the shared isUnsignedCertificate, not a local reading", + old: "isUnsignedCertificate(route.certificate)", + new: '(route.certificate?.signature ?? "") === ""', + }, ]; -if (existsSync(sidecar)) { - writeFileSync(target, readFileSync(sidecar)); - unlinkSync(sidecar); - console.log(`repaired ${target} from ${sidecar}: a previous run stopped before restoring it`); -} - -const original = readFileSync(target); -const originalText = original.toString("utf8"); -const originalDigest = digest(original); - -// Anchors are written with "\n"; the checkout may be CRLF (autocrlf). Match -// the file's own line ending so a multi-line anchor cannot silently miss. -const eol = originalText.includes("\r\n") ? "\r\n" : "\n"; -const withEol = text => text.replace(/\r?\n/g, eol); - function digest(bytes) { return createHash("sha256").update(bytes).digest("hex"); } -function npm(...args) { - execFileSync(process.execPath, [npmCli, ...args, "--workspace", "packages/cultnet-ts"], { +function npm(workspace, ...args) { + execFileSync(process.execPath, [npmCli, ...args, "--workspace", workspace], { cwd: repoRoot, stdio: ["ignore", "pipe", "pipe"], }); } -function testsPass() { +function testsPass(workspace) { try { - npm("run", "test"); + npm(workspace, "run", "test"); return true; } catch { return false; } } -function restore() { - writeFileSync(target, original); - const restored = digest(readFileSync(target)); - if (restored !== originalDigest) { - throw new Error(`restore failed: ${target} digest ${restored} != ${originalDigest}`); - } -} - function occurrences(text, needle) { return text.split(needle).length - 1; } @@ -270,43 +277,81 @@ function occurrences(text, needle) { const results = []; let failed = false; -const last = mutations[mutations.length - 1]; -if (!originalText.includes(sentinel) || originalText.replace(withEol(last.old), withEol(last.new)).includes(sentinel)) { - throw new Error(`the sentinel '${sentinel}' must be in the source and removed by the last mutation ('${last.rule}')`); -} - -writeFileSync(sidecar, original); -try { - writeFileSync(target, Buffer.from(originalText, "utf8")); - const controlPass = testsPass(); - results.push({ rule: "control (no-op rewrite)", outcome: controlPass ? "green" : "RED" }); - if (!controlPass) failed = true; - else { - for (const mutation of mutations) { - const [old, replacement] = [withEol(mutation.old), withEol(mutation.new)]; - const count = occurrences(originalText, old); - if (count !== 1) { - throw new Error(`anchor for '${mutation.rule}' matched ${count} times, expected exactly 1`); - } - writeFileSync(target, Buffer.from(originalText.replace(old, replacement), "utf8")); - const pass = testsPass(); - restore(); - results.push({ rule: mutation.rule, outcome: pass ? "SURVIVED" : "killed" }); - if (pass) failed = true; - } +for (const [name, target] of Object.entries(targets)) { + const own = mutations.filter(mutation => (mutation.target ?? "shared") === name); + if (own.length === 0) throw new Error(`target '${name}' has no mutations`); + const sidecar = `${target.file}.mutation-original`; + if (existsSync(sidecar)) { + writeFileSync(target.file, readFileSync(sidecar)); + unlinkSync(sidecar); + console.log(`repaired ${target.file} from ${sidecar}: a previous run stopped before restoring it`); } -} finally { - restore(); -} -unlinkSync(sidecar); -// Every test run above rebuilt dist/ from a mutant; put the restored source back in it. -npm("run", "build"); -if (!readFileSync(dist, "utf8").includes(sentinel)) { - throw new Error(`${dist} does not contain '${sentinel}' after the rebuild; it still carries a mutant`); + const original = readFileSync(target.file); + const originalText = original.toString("utf8"); + const originalDigest = digest(original); + + // Anchors are written with "\n"; the checkout may be CRLF (autocrlf). Match + // the file's own line ending so a multi-line anchor cannot silently miss. + const eol = originalText.includes("\r\n") ? "\r\n" : "\n"; + const withEol = text => text.replace(/\r?\n/g, eol); + + const restore = () => { + writeFileSync(target.file, original); + const restored = digest(readFileSync(target.file)); + if (restored !== originalDigest) { + throw new Error(`restore failed: ${target.file} digest ${restored} != ${originalDigest}`); + } + }; + + const last = own[own.length - 1]; + if (!originalText.includes(target.sentinel) || + originalText.replace(withEol(last.old), withEol(last.new)).includes(target.sentinel)) { + throw new Error( + `the sentinel '${target.sentinel}' must be in ${target.file} and removed by its last mutation ('${last.rule}')`, + ); + } + + writeFileSync(sidecar, original); + try { + writeFileSync(target.file, Buffer.from(originalText, "utf8")); + const controlPass = testsPass(target.workspace); + results.push({ target: name, outcome: controlPass ? "green" : "RED", rule: "control (no-op rewrite)" }); + if (!controlPass) failed = true; + else { + for (const mutation of own) { + const [old, replacement] = [withEol(mutation.old), withEol(mutation.new)]; + const count = occurrences(originalText, old); + if (count !== 1) { + throw new Error(`anchor for '${mutation.rule}' matched ${count} times in ${target.file}, expected exactly 1`); + } + writeFileSync(target.file, Buffer.from(originalText.replace(old, replacement), "utf8")); + const pass = testsPass(target.workspace); + restore(); + results.push({ target: name, outcome: pass ? "SURVIVED" : "killed", rule: mutation.rule }); + if (pass) failed = true; + } + } + } finally { + // A verified restore is what the sidecar exists to guarantee, so it goes + // here and not after the try: a throw mid-run used to leave the sidecar + // behind, and the next run "repaired" the file from bytes that were already + // stale, silently undoing whatever had been fixed in between. + restore(); + unlinkSync(sidecar); + } + + // Every test run above rebuilt dist/ from a mutant; put the restored source back in it. + npm(target.workspace, "run", "build"); + if (!readFileSync(target.dist, "utf8").includes(target.sentinel)) { + throw new Error(`${target.dist} does not contain '${target.sentinel}' after the rebuild; it still carries a mutant`); + } + results.push({ + target: name, + outcome: "restored", + rule: `${target.file} sha256=${originalDigest}, rebuilt ${target.dist}`, + }); } -for (const result of results) console.log(`${result.outcome.padEnd(9)} ${result.rule}`); -console.log(`restored ${target} sha256=${originalDigest}`); -console.log(`rebuilt ${dist}`); +for (const result of results) console.log(`${result.outcome.padEnd(9)} [${result.target}] ${result.rule}`); process.exit(failed ? 1 : 0); From 0dfef0e5ebc4e785cad0e250df90fd151d02068d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 17:40:39 +0200 Subject: [PATCH 42/94] Run the TypeScript authority tests in CI, on both operating systems Nothing ran `npm run test --workspace packages/cultnet-ts` in CI. The shared route verifier's tests, which are the whole TypeScript side of the CultMesh authority contract, ran only on a developer's machine, and the browser client's tests ran nowhere. `cultnet-interop.yml` is windows-latest and triggers on main only, so even that would not have covered Linux or a pull request. Both now run in `cultmesh-portability.yml`'s `reactive-and-resource-lifetime` job, beside the step that verifies the same vectors with the C# reference. That job already matrixes windows-latest and ubuntu-latest, already triggers on main, codex/** and pull requests, and already installs the TypeScript workspace dependencies, so the steps cost two npm runs and no new setup. Co-Authored-By: Claude Fable 5.1 --- .github/workflows/cultmesh-portability.yml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cultmesh-portability.yml b/.github/workflows/cultmesh-portability.yml index 55d2bea8..9f088e95 100644 --- a/.github/workflows/cultmesh-portability.yml +++ b/.github/workflows/cultmesh-portability.yml @@ -96,12 +96,25 @@ jobs: --filter FullyQualifiedName~Document_OneHundredThousandDistinctLeaseCyclesLeaveNoResourcesOrCallbacks --logger "console;verbosity=minimal" + # The TypeScript side of the CultMesh authority rules. This job is the + # only one that runs on both Windows and Linux for main, codex/** and + # pull requests: cultnet-interop.yml is windows-latest and main-only, so + # until these steps existed the shared verifier's tests never ran on + # Linux at all, and the browser client's never ran in CI on any OS. + # packages/cultnet-ts verifies both vector files; cultmesh-browser proves + # the browser client reads the shared rules rather than its own. + - name: Verify the CultMesh authority rules with the TypeScript verifier + run: npm run test --workspace packages/cultnet-ts + + - name: Verify the browser client against the shared TypeScript verifier + run: npm run test --workspace packages/cultmesh-browser + # Both directions of the CultMesh authority vectors: the C#-written # file (contracts/cultmesh/authority-route-vectors.json) and the # TypeScript-signed file (authority-route-vectors.ts-signed.json) are # verified by the C# reference here; the TypeScript side verifies both - # in `npm test --workspace packages/cultnet-ts`. CULTMESH_WRITE_VECTORS - # is never set in CI: the committed files are the contract. + # in the step above. CULTMESH_WRITE_VECTORS is never set in CI: the + # committed files are the contract. - name: Verify the CultMesh authority vectors with the C# reference run: >- dotnet test tests/GameCult.Mesh.Tests/GameCult.Mesh.Tests.csproj From 74fee16003942d3a1dcb1b03edc7a82dd7c6ef39 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 17:51:25 +0200 Subject: [PATCH 43/94] Record the Cut 1 edge-alignment batch TypeScript now cleans a route the way the C# constructors do, reads whitespace with C#'s alphabet, refuses the endpoint spellings the URL parser would otherwise repair, and names the two signature refusals as C# names them. Every probe reruns with zero reachable disagreements. Two scars kept for the postmortem: a sidecar that reverted fixes it was meant to protect, and a NUL byte that made git read source as binary. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 33 ++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index 69e94093..0105e7de 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -125,6 +125,39 @@ real (in Hands): verify under current rules, and the TS test pins that the committed file verifies under the current module. +**The edge-alignment batch landed** (Opus) at `e67e695` (C#'s whitespace +set through three named helpers; the two signature refusals split to C#'s +texts), `c4c2330` (route fields cleaned before the transcript as the C# +constructors clean them: trim, drop blanks, distinct, sort; generation and +key ids trimmed; a null or empty protocol list transcribes as `""`, and the +TS default that wrote bytes the reference never writes is gone; `verseId` +deliberately raw, because `CanonicalRoute` passes it raw), `803ee12` (a +raw-endpoint pre-check refusing the spellings WHATWG `URL` repairs and +`System.Uri` does not; loopback disagreements 15 → 6, all six documented +unreachable), `dfe582e` (the browser's local reading of "unsigned" killed +by a whitespace-signature session test; the runner mutates the browser +target too, with per-target sidecar, control, sentinel and post-restore +assertion) and `0dfef0e` (the TypeScript authority tests in CI on both +operating systems). Soul's probes rerun: 88 endpoints, zero reachable +disagreements; 34 code points, zero; five signature shapes, byte-identical +messages; fifteen field tampers, zero mismatches against C#'s answers. +Tests 77, 18, 79, 10; closure smoke four tarballs; 33 shared and one +browser mutation killed. + +Two scars from the batch, both recorded because they are the kind a +postmortem should carry: **the runner's sidecar bit twice**, a throw inside +the mutation loop leaving it behind so the next run "repaired" from stale +bytes and silently reverted two fixes Hands had just made (the sidecar is +now removed in the `finally` immediately after the verified restore); and +**a literal NUL byte was committed inside a regex** at `803ee12`, which made +git classify the file as binary, stop normalising its line endings, and +diff the whole file as a rewrite, escaped at `dfe582e`. Residuals named, +not guessed at: `isProtectedEndpoint` did not get the pre-check and no +probe covers protected-scheme spellings; a negative priority throws in C# +and transcribes in TS, unreachable while only C# signs; two browser +mutations survive because the verifier refuses those routes first. Closing +Soul pass in flight. + Seen by Hands, recorded for section 15: `packages/cultnet-ts/src/generated/swarm-contracts.generated.ts` is rewritten with LF by every build while the tree is `autocrlf=true`, so it shows modified with zero content diff after any build; the generator's From 565ce79a4afb458f8acb08a44109ec7805969bda Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 18:21:52 +0200 Subject: [PATCH 44/94] Close Cut 1 and start Cut 2 Three Soul passes and three fix batches leave one verifier whose rules match the C# reference as executed, parity pinned both ways and run in CI on both operating systems. Three residuals ride with Cut 2. Two statements this map made about its own batch were overstated and are corrected: the NUL byte never caused a rewrite, and CI was not green throughout. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 41 ++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index 0105e7de..4a76e87e 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -13,9 +13,9 @@ ledger are remapped under C (landed 2026-09-16, same day). Q8 is ruled: the built binaries are committed to the tree (section 11.2). No operator question is open. **Cut 1 landed** at `e234a64` (shared verifier, tests, C#-written vectors), `66286b9` (browser copy deleted, −143 net) and -`062a5c6` (mutation runner; twelve killed, one equivalent). Soul's pass -found the verifier and the C#-to-TypeScript bridge sound and proved the -other direction by probe; a fix batch is in Hands for the six findings below. +`062a5c6` (mutation runner; twelve killed, one equivalent), then three +Soul passes and three fix batches; **closed 2026-09-16**, three residuals +carried into Cut 2's Hands pass. **Cut 2 in Hands.** **Cut 1 Soul findings, 2026-09-16.** Held: every test count, both negative greps, all twelve mutations rerun and killed, the control catching a @@ -155,8 +155,39 @@ diff the whole file as a rewrite, escaped at `dfe582e`. Residuals named, not guessed at: `isProtectedEndpoint` did not get the pre-check and no probe covers protected-scheme spellings; a negative priority throws in C# and transcribes in TS, unreachable while only C# signs; two browser -mutations survive because the verifier refuses those routes first. Closing -Soul pass in flight. +mutations survive because the verifier refuses those routes first. + +**Third Soul pass, closing.** Held: all 34 whitespace code points in the +browser path too, with C#'s `VerifySessionProof` answer as the +expectation; the three signature refusals byte-identical; cleaning parity +in both directions with fresh keys (nine of nine each way, a padded +`verseId` refused cross-wise, C# confirmed not to trim it); 88 loopback +spellings with only the documented unreachable disagreements; the runner's +control writing through the same path as its mutations; CI's job, matrix, +triggers and setup order as promised; every suite, the closure smoke, both +greps. **Cut 1 is closed; Cut 2 may start.** Three residuals go with Cut 2's +Hands pass: + +- **`isProtectedEndpoint` lacks the raw-shape pre-check** that + `isLoopbackEndpoint` got, so eleven spellings C# refuses as unparseable + are accepted and dialled after repair by `URL`. A trusted signer would + have to emit a malformed endpoint, so security holds and the parity + invariant does not. Five lines. Low-medium. +- **A literal U+001F byte sits in the separator string** in source and + twice in the tests, where C# spells it ``; git does not treat it as + binary, but any editor that strips C0 controls changes every signature + with no visible diff. The NUL scar one rank lower. +- **The sidecar footgun is narrowed, not removed**: a SIGKILL still leaves + it, and an edit made before the next run is overwritten by the repair. + Repair must refuse when the file matches neither the sidecar nor the + mutant. + +Two corrections to this map's own record of the batch: **the NUL scar was +overstated**, since the byte sat past git's binary sniff and no whole-file +rewrite exists in history, only the normalisation path saw it and the blob +was LF-only anyway; and **CI was not green throughout the batch**, two of +its commits failing an unrelated Eve checkpoint job before the authority +steps existed, green from `0dfef0e`. Seen by Hands, recorded for section 15: `packages/cultnet-ts/src/generated/swarm-contracts.generated.ts` is rewritten with LF by every build while the tree is `autocrlf=true`, so From c64a2da81d65ddbbfa56ebaff62499416dc0f415 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 18:29:13 +0200 Subject: [PATCH 45/94] Refuse the URL-repaired spellings in the protection gate too `isLoopbackEndpoint` hands its endpoint to `refusedByCSharpUriShape` before `URL` sees it; `isProtectedEndpoint` did not, and `URL` repairs eleven spellings `System.Uri` refuses outright. Every one of them answered protected here and unprotected in the C# reference, which is the dangerous direction: the channel-protection gate opened on a route `IsProtected` would have closed. `wss:x`, `wss:host`, `wss:host:8443`, `wss:/host` and `wss:///host` have no authority for `System.Uri`; `wss://host\path` and `wss://host:8443\` carry a backslash; `wss://ho\tst/m`, `wss://host\t/m` and `quic://ho\tst` a tab, and `wss://host\r\n/m` a CR/LF, all of which `URL` deletes. Soul's 71 raw-shape spellings go in as a table with the answer the C# `IsProtected` gave for each on 2026-09-16, and the test asserts the invariant rather than equality: TypeScript may never call an endpoint protected that C# refuses. Eleven of the 71 now differ the safe way round, C# protected and this not, and they are pinned by name rather than excluded, so neither a twelfth joining them nor one of them flipping passes quietly. Two throw in `URL` before any rule of ours runs (an IPv6 zone id, a non-breaking-space host); the other nine are host repairs `refusedByCSharpUriShape` refuses on purpose, because the same repair would make `isLoopbackEndpoint` lie. None is dialable as a browser CultMesh route. The mutation that drops the pre-check from `isProtectedEndpoint` alone, leaving `isLoopbackEndpoint`'s in place, is killed by that test. Co-Authored-By: Claude Fable 5.1 --- packages/cultnet-ts/src/cultmesh-authority.ts | 22 +++- .../test/cultmesh-authority.test.ts | 118 ++++++++++++++++++ scripts/mutate-cultmesh-authority.mjs | 8 ++ 3 files changed, 147 insertions(+), 1 deletion(-) diff --git a/packages/cultnet-ts/src/cultmesh-authority.ts b/packages/cultnet-ts/src/cultmesh-authority.ts index b9681c71..10c9d187 100644 --- a/packages/cultnet-ts/src/cultmesh-authority.ts +++ b/packages/cultnet-ts/src/cultmesh-authority.ts @@ -361,8 +361,28 @@ export function isLoopbackEndpoint(value: string): boolean { } } -/** The C# rule (`CultMeshAuthorityProof.cs`, `IsProtected`): wss, https, or any scheme containing "quic". */ +/** + * The C# rule (`CultMeshAuthorityProof.cs`, `IsProtected`): wss, https, or any + * scheme containing "quic", over a string `System.Uri` parses at all. + * + * `refusedByCSharpUriShape` runs first here for the same reason it runs first in + * `isLoopbackEndpoint`, and it matters more: `URL` repairs eleven spellings + * `System.Uri` refuses outright, and every one of them would be *protected* here + * and unprotected in C#. `wss:x`, `wss:host`, `wss:host:8443`, `wss:/host` and + * `wss:///host` have no authority for `System.Uri` to accept; `wss://host\path` + * and `wss://host:8443\` carry a backslash; `wss://ho\tst/m`, `wss://host\t/m`, + * `quic://ho\tst` carry a tab and `wss://host\r\n/m` a CR/LF, which `URL` + * deletes. Letting any of them answer true would clear the channel-protection + * gate on a route C# refuses. + * + * Two spellings of Soul's 71 still disagree, both the safe way round: C# calls + * them protected and this answers false, so a route is refused rather than + * admitted. `wss://[::1%eth0]/m` (the IPv6 zone id) and `wss://host /m` + * (a non-breaking space in the host) both throw in `URL`, so they answered + * false before this pre-check existed too. Neither is dialable from a browser. + */ export function isProtectedEndpoint(value: string): boolean { + if (refusedByCSharpUriShape(value)) return false; let scheme: string; try { scheme = new URL(value).protocol.slice(0, -1).toLowerCase(); diff --git a/packages/cultnet-ts/test/cultmesh-authority.test.ts b/packages/cultnet-ts/test/cultmesh-authority.test.ts index f5e61b80..3017300f 100644 --- a/packages/cultnet-ts/test/cultmesh-authority.test.ts +++ b/packages/cultnet-ts/test/cultmesh-authority.test.ts @@ -311,6 +311,124 @@ test("isProtectedEndpoint is the C# rule: wss, https, or any scheme containing q } }); +// Every raw-shape spelling Soul put to both sides on 2026-09-16, with the answer +// `IsProtected` gave through `CultMeshAuthorityTrustPolicy` as the expectation. +// The list is Soul's 71 verbatim, duplicate included. +const CSHARP_PROTECTED_ANSWERS: readonly (readonly [string, boolean])[] = [ + ["ws:x", false], + ["wss:x", false], + ["wss:/host", false], + ["wss:///host", false], + ["wss://host:8443\\", false], + ["wss://host\\path", false], + ["wss:\\\\host/m", true], + ["wss://host./m", true], + ["wss://\uff48\uff4f\uff53\uff54/m", true], + ["QUIC://host/m", true], + ["Quic+x://host/m", true], + ["cultmesh-state+quic://h:4433/?c=1", true], + ["wss://ho\tst/m", false], + ["wss://host\t/m", false], + ["\twss://host/m", true], + [" wss://host/m", true], + ["wss://host/m ", true], + ["wss://host/m\n", true], + ["wss://host:99999/m", false], + ["wss://[::1%eth0]/m", true], + ["wss://user:pw@host/m", true], + ["https://host/m", true], + ["HTTPS://host", true], + ["ws://host/m", false], + ["WS://host/m", false], + ["http://host/m", false], + ["quic:host", true], + ["quic:", true], + ["wss:", false], + ["wss://", false], + ["wss:///", false], + ["quic+wss://host", true], + ["x-quic://host", true], + ["xquicx://host", true], + ["wss ://host/m", false], + ["w ss://host/m", false], + ["wss://host:abc/m", false], + ["wss://\uff11\uff12\uff17.0.0.1/m", true], + ["wss://127.0.0.1./m", true], + ["not a url", false], + ["", false], + [" ", false], + ["wss://host?x=1", true], + ["wss://host#f", true], + ["wss://[::1]/m", true], + ["wss://[::1", false], + ["wss://host/m\u0000", true], + ["wss://host/\u0085m", true], + ["\u0085wss://host/m", false], + ["\ufeffwss://host/m", false], + ["ws://127.0.0.1\\m", false], + ["ws:127.0.0.1", false], + ["ws:/127.0.0.1", false], + ["ws:///127.0.0.1", false], + ["ws://127.0.0.1./m", false], + ["ws://\uff4c\uff4f\uff43\uff41\uff4c\uff48\uff4f\uff53\uff54/m", false], + ["ws://localhost\t/m", false], + ["wss://host:8443\\", false], + ["wss:host", false], + ["wss:host:8443", false], + ["wss://host:8443/\\", true], + ["wss://ho st/m", false], + ["wss://host%20/m", false], + ["wss://host\u00a0/m", true], + ["wss://host\r\n/m", false], + ["wss:// host/m", false], + ["wss://host /m", false], + ["quic://ho\tst", false], + ["QUIC:\\\\host", true], + ["ws://127.0.0.1:1/m\t", false], + ["wss://xn--80ak6aa92e.com/m", true], +]; + +// The eleven of the 71 where the two sides still differ, every one of them the +// safe way round: C# calls the endpoint protected and TypeScript does not, so a +// route is refused rather than admitted. `refusedByCSharpUriShape` is stricter +// than `System.Uri.TryCreate` on purpose — it also refuses the host repairs that +// would make `isLoopbackEndpoint` lie — and a zone id and a non-breaking-space +// host throw in `URL` before any rule of ours runs. None of them is dialable as +// a browser CultMesh route. Pinned exactly, not merely excluded: if one of these +// starts answering true, or a twelfth spelling joins them, this fails. +const STRICTER_THAN_CSHARP: readonly string[] = [ + "wss:\\\\host/m", + "wss://host./m", + "wss://\uff48\uff4f\uff53\uff54/m", + "wss://[::1%eth0]/m", + "quic:host", + "quic:", + "wss://\uff11\uff12\uff17.0.0.1/m", + "wss://127.0.0.1./m", + "wss://host:8443/\\", + "wss://host\u00a0/m", + "QUIC:\\\\host", +]; + +test("isProtectedEndpoint is never more permissive than the C# IsProtected, over every raw-shape spelling Soul probed", () => { + assert.equal(CSHARP_PROTECTED_ANSWERS.length, 71); + const stricter = new Set(STRICTER_THAN_CSHARP); + // The invariant that matters: TypeScript must never call an endpoint protected + // that C# refuses, or the channel-protection gate opens on a route the + // reference would have closed. `URL` repairs eleven spellings `System.Uri` + // refuses outright, and every one of them used to land on the wrong side here. + const morePermissive: string[] = []; + const unexpectedlyStricter: string[] = []; + for (const [endpoint, csharp] of CSHARP_PROTECTED_ANSWERS) { + const ours = isProtectedEndpoint(endpoint); + if (ours && !csharp) morePermissive.push(JSON.stringify(endpoint)); + if (!ours && csharp && !stricter.has(endpoint)) unexpectedlyStricter.push(JSON.stringify(endpoint)); + if (stricter.has(endpoint)) assert.equal(ours, false, `${JSON.stringify(endpoint)} is listed as stricter`); + } + assert.deepEqual(morePermissive, []); + assert.deepEqual(unexpectedlyStricter, []); +}); + // Every endpoint Soul put to both sides on 2026-09-16, with the answer // `System.Uri.IsLoopback` gave through `CultMeshAuthorityTrustPolicy` as the // expectation. Six of the probe's 88 are left out and named in the doc comment diff --git a/scripts/mutate-cultmesh-authority.mjs b/scripts/mutate-cultmesh-authority.mjs index 92e4bf53..1e3e1b32 100644 --- a/scripts/mutate-cultmesh-authority.mjs +++ b/scripts/mutate-cultmesh-authority.mjs @@ -233,6 +233,14 @@ const mutations = [ old: 'scheme.includes("quic")', new: 'scheme === "quic"', }, + { + // Only `isProtectedEndpoint`'s copy: `isLoopbackEndpoint` keeps its own, so + // this pins that the protection gate refuses the spellings `URL` repairs + // rather than inheriting the answer from the loopback rule. + rule: "isProtectedEndpoint refuses the raw shapes System.Uri refuses", + old: " if (refusedByCSharpUriShape(value)) return false;\n let scheme: string;\n", + new: " let scheme: string;\n", + }, { rule: "protected scheme: https", old: 'scheme === "https" || ', From 6c933d034bf8df20991c38573a61a6f6355ffeef Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 18:31:52 +0200 Subject: [PATCH 46/94] Spell the transcript separator as an escape, not a raw byte The unit separator that joins protocol ids sat in the source as a literal U+001F: once in `cultmesh-authority.ts` and twice in its test. Every editor, every diff and every review renders it as nothing, so `join("")` reads as a join on the empty string and the transcript looks wrong to anyone checking it against the C# reference, which spells the same separator as an escape. The bytes were right, which is exactly why nothing caught it. The three become escapes. The bytes do not move: the C#-written and the TypeScript-written route vectors both still verify through the shared module, and the sorted-transcript test still builds the same expected bytes. A new test reads both files and refuses any byte below 0x20 that is not LF or CR, so the class recurs loudly rather than silently. It earned its keep on the first run by catching a literal U+001F in the comment introducing it. Co-Authored-By: Claude Fable 5.1 --- packages/cultnet-ts/src/cultmesh-authority.ts | 2 +- .../test/cultmesh-authority.test.ts | 21 ++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/cultnet-ts/src/cultmesh-authority.ts b/packages/cultnet-ts/src/cultmesh-authority.ts index 10c9d187..d61f6072 100644 --- a/packages/cultnet-ts/src/cultmesh-authority.ts +++ b/packages/cultnet-ts/src/cultmesh-authority.ts @@ -205,7 +205,7 @@ export function canonicalRoute(route: CultMeshAuthorityRouteView): Uint8Array { route.verseId, authorityRuntimeId, endpoint, - cleanProtocolIds(route.protocolIds).join(""), + cleanProtocolIds(route.protocolIds).join("\u001f"), String(route.priority ?? 0), // A blank generation is not blank in C#: the route constructor substitutes // the runtime id and endpoint, already cleaned, joined by "@". diff --git a/packages/cultnet-ts/test/cultmesh-authority.test.ts b/packages/cultnet-ts/test/cultmesh-authority.test.ts index 3017300f..dbf5a8d7 100644 --- a/packages/cultnet-ts/test/cultmesh-authority.test.ts +++ b/packages/cultnet-ts/test/cultmesh-authority.test.ts @@ -278,7 +278,7 @@ test("protocol ids are sorted ordinally into the transcript, whatever order the route.verseId, route.authorityRuntimeId, route.endpoint, - "cultmesh.content.v1cultmesh.documents.v1cultmesh.realtime.v1", + "cultmesh.content.v1\u001fcultmesh.documents.v1\u001fcultmesh.realtime.v1", "0", route.generation, certificate.providerKey.keyId, @@ -655,3 +655,22 @@ test("the shared module keeps the browser-safe surface: no node: import", () => const source = readFileSync(join(__dirname, "..", "..", "src", "cultmesh-authority.ts"), "utf8"); assert.doesNotMatch(source, /from "node:|require\("node:/); }); + +// The transcript separator is U+001F, and it sat in these two files as a literal +// byte: invisible in every editor and diff, indistinguishable from the empty +// string in `join("")`. The bytes were right, which is why nothing caught it. +// Any control character in a string literal has the same problem, so none of +// them may be spelled literally here; a backslash-u escape is the only spelling. +for (const [label, path] of [ + ["the shared module", join(__dirname, "..", "..", "src", "cultmesh-authority.ts")], + ["this test", join(__dirname, "..", "..", "test", "cultmesh-authority.test.ts")], +] as const) test(`${label} spells control characters as escapes, never as literal bytes`, () => { + const bytes = readFileSync(path); + const offenders: string[] = []; + for (const [offset, byte] of bytes.entries()) { + if (byte >= 0x20 || byte === 0x0a || byte === 0x0d) continue; + const line = bytes.subarray(0, offset).toString("utf8").split("\n").length; + offenders.push(`0x${byte.toString(16).padStart(2, "0")} at byte ${offset} (line ${line})`); + } + assert.deepEqual(offenders, []); +}); From fe2555da6370626d51efb6145d1755de75bb72ca Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 18:35:44 +0200 Subject: [PATCH 47/94] Repair only the file states the mutation runner itself wrote A SIGKILL leaves the sidecar behind, and the next run wrote it over whatever the file then held. That is right after a kill and destructive after one: a fix written to the source between the kill and the next run was reverted to bytes from before the kill, with a line claiming a repair, and the run then reported mutation results for code nobody had written. The mutation table is the record of what a live run can leave behind: the original (which is the sidecar, and also what the no-op control writes) or the original with exactly one of that target's mutations applied. Repair now recognises those and nothing else. A file matching neither stops the run with its own digest and the sidecar's and changes nothing. Reproduced both halves against the shared target. Killed mid-mutation, then appended a line to the source: the rerun exits 1, prints both sha256s, and the hand-written line is still there afterwards. With the mutant put back and the sidecar unchanged, the rerun repairs as before and now names the mutation the dead run was inside. Co-Authored-By: Claude Fable 5.1 --- scripts/mutate-cultmesh-authority.mjs | 54 ++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/scripts/mutate-cultmesh-authority.mjs b/scripts/mutate-cultmesh-authority.mjs index 1e3e1b32..8aec4eee 100644 --- a/scripts/mutate-cultmesh-authority.mjs +++ b/scripts/mutate-cultmesh-authority.mjs @@ -282,6 +282,54 @@ function occurrences(text, needle) { return text.split(needle).length - 1; } +/** + * Repairs a file left mutated by a run that died before its `finally`, and only + * that. + * + * A SIGKILL leaves the sidecar behind. The repair used to write the sidecar over + * whatever the file now held, which is right after a kill and destructive after + * one: a fix made to the source between the kill and the next run was silently + * reverted to bytes from before the kill, and the run then reported on code + * nobody had written. + * + * So repair only what this script can prove it wrote. The mutation table is the + * record: every file state a live run can leave behind is either the original + * (the sidecar, also what the no-op control writes) or the original with exactly + * one of that target's mutations applied. Anything else — a hand edit, a + * half-written file, a different branch — is somebody else's, and the run stops + * with both digests rather than guessing. + */ +function repair(name, target, own, sidecar) { + const original = readFileSync(sidecar); + const originalText = original.toString("utf8"); + const eol = originalText.includes("\r\n") ? "\r\n" : "\n"; + const withEol = text => text.replace(/\r?\n/g, eol); + const current = readFileSync(target.file); + const currentDigest = digest(current); + const originalDigest = digest(original); + + if (currentDigest === originalDigest || currentDigest === digest(Buffer.from(originalText, "utf8"))) { + unlinkSync(sidecar); + console.log(`${target.file} is already the original; dropped the stale ${sidecar}`); + return; + } + + const currentText = current.toString("utf8"); + const mutant = own.find(mutation => + originalText.replace(withEol(mutation.old), withEol(mutation.new)) === currentText); + if (!mutant) { + throw new Error( + `${target.file} is neither the original nor any mutation of target '${name}', so a previous run did not write it.\n` + + ` ${target.file} sha256=${currentDigest}\n` + + ` ${sidecar} sha256=${originalDigest}\n` + + " Refusing to overwrite it. Reconcile the file by hand, then delete the sidecar.", + ); + } + writeFileSync(target.file, original); + unlinkSync(sidecar); + console.log(`repaired ${target.file} from ${sidecar}: a previous run stopped inside '${mutant.rule}'`); +} + const results = []; let failed = false; @@ -289,11 +337,7 @@ for (const [name, target] of Object.entries(targets)) { const own = mutations.filter(mutation => (mutation.target ?? "shared") === name); if (own.length === 0) throw new Error(`target '${name}' has no mutations`); const sidecar = `${target.file}.mutation-original`; - if (existsSync(sidecar)) { - writeFileSync(target.file, readFileSync(sidecar)); - unlinkSync(sidecar); - console.log(`repaired ${target.file} from ${sidecar}: a previous run stopped before restoring it`); - } + if (existsSync(sidecar)) repair(name, target, own, sidecar); const original = readFileSync(target.file); const originalText = original.toString("utf8"); From 6cbc73fb17bfe08259a0b61f658a1e324c56b665 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 19:20:41 +0200 Subject: [PATCH 48/94] Encode a CultMesh realtime frame in TypeScript One codec, `packages/cultmesh-ts/src/realtime-wire.ts`, rule for rule what `CultMeshRealtimeWireProtocol` does: the 37-byte little-endian fixed header with magic 0x31545343, the delivery byte as the C# enum ordinal, the i64 epoch and sequence, three u16 identity lengths, the i32 payload length, the stamped header size and wire version, then UTF-8 identities and the payload. It touches no socket; QUIC stream framing stays transport-owned. The blank reading in `Validate` is `IsNullOrWhiteSpace`, whose whitespace set is not `String.prototype.trim`'s, so it borrows `isNullOrWhiteSpaceCSharp` from `cultnet-ts` rather than growing a second reading of the same rule. Byte parity is proven in both directions and in two processes, which is what the authority vectors cost us to learn. `contracts/cultmesh/realtime-frame-vectors.json` is written by the new C# test under CULTMESH_WRITE_VECTORS=1 and decoded and re-encoded here; `realtime-frame-vectors.ts-written.json` is written by `scripts/write-cultmesh-realtime-frame-vectors.mjs` with this codec, over different identities and epochs, and decoded by the same C# test with the reference implementation alone. Both files share one field shape, so each side reads both with one reader. The two cases that would put megabytes into a committed contract file, identities at exactly 65,535 UTF-8 bytes and a 64 MiB payload, are recorded as a build rule plus the digest of the whole encoding; both sides build them the same way. Three things the C# reference gets from its type system and TypeScript does not, each refused rather than left to surface as a stray runtime error: a `bigint` outside the i64 range, a delivery string the union cannot spell, and a leading U+FEFF, which `TextDecoder` deletes by default and `Encoding.UTF8.GetString` keeps. The last one is a real divergence the test caught; the decoder now sets `ignoreBOM`. U+FEFF is not whitespace to .NET, so such an identity passes the transport contract and reaches the wire. There was no C# test for this codec before; this is also its first. Co-Authored-By: Claude Fable 5.1 --- .../cultmesh/realtime-frame-vectors.json | 177 +++++++++ .../realtime-frame-vectors.ts-written.json | 177 +++++++++ packages/cultmesh-ts/src/index.ts | 1 + packages/cultmesh-ts/src/realtime-wire.ts | 178 +++++++++ .../cultmesh-ts/test/realtime-wire.test.ts | 344 +++++++++++++++++ .../write-cultmesh-realtime-frame-vectors.mjs | 177 +++++++++ .../CultMeshRealtimeWireProtocolTests.cs | 361 ++++++++++++++++++ 7 files changed, 1415 insertions(+) create mode 100644 contracts/cultmesh/realtime-frame-vectors.json create mode 100644 contracts/cultmesh/realtime-frame-vectors.ts-written.json create mode 100644 packages/cultmesh-ts/src/realtime-wire.ts create mode 100644 packages/cultmesh-ts/test/realtime-wire.test.ts create mode 100644 scripts/write-cultmesh-realtime-frame-vectors.mjs create mode 100644 tests/GameCult.Mesh.Tests/CultMeshRealtimeWireProtocolTests.cs diff --git a/contracts/cultmesh/realtime-frame-vectors.json b/contracts/cultmesh/realtime-frame-vectors.json new file mode 100644 index 00000000..467c784d --- /dev/null +++ b/contracts/cultmesh/realtime-frame-vectors.json @@ -0,0 +1,177 @@ +{ + "frames": [ + { + "label": "reliable-ordered, small payload", + "fields": { + "channelId": "aetheria.zone-1", + "schemaId": "cultmesh.realtime.v1", + "bodyId": "body-7", + "producerEpoch": 1, + "sequence": 2, + "delivery": "reliable-ordered", + "payload": "AH+A/yo=" + }, + "encoding": "Q1NUMQABAAAAAAAAAAIAAAAAAAAADwAUAAYABQAAACUAAAABAGFldGhlcmlhLnpvbmUtMWN1bHRtZXNoLnJlYWx0aW1lLnYxYm9keS03AH+A/yo=", + "encodedLength": 83, + "sha256OfEncoding": "d04539b99790560e5e570208d92d3ac25f85909a36bfeb190c2080288cc9f1d4" + }, + { + "label": "latest-only, small payload", + "fields": { + "channelId": "aetheria.zone-1", + "schemaId": "cultmesh.realtime.v1", + "bodyId": "body-7", + "producerEpoch": 3, + "sequence": 4, + "delivery": "latest-only", + "payload": "AQID" + }, + "encoding": "Q1NUMQEDAAAAAAAAAAQAAAAAAAAADwAUAAYAAwAAACUAAAABAGFldGhlcmlhLnpvbmUtMWN1bHRtZXNoLnJlYWx0aW1lLnYxYm9keS03AQID", + "encodedLength": 81, + "sha256OfEncoding": "2c875718cf4968979f3cd4083ba2b279e8c03815ad3447c66037ee4530b2814a" + }, + { + "label": "unreliable, small payload", + "fields": { + "channelId": "aetheria.zone-1", + "schemaId": "cultmesh.realtime.v1", + "bodyId": "body-7", + "producerEpoch": 5, + "sequence": 6, + "delivery": "unreliable", + "payload": "/g==" + }, + "encoding": "Q1NUMQIFAAAAAAAAAAYAAAAAAAAADwAUAAYAAQAAACUAAAABAGFldGhlcmlhLnpvbmUtMWN1bHRtZXNoLnJlYWx0aW1lLnYxYm9keS03/g==", + "encodedLength": 79, + "sha256OfEncoding": "b932adf333a0ca73d3a9077e15cf9062070a3084a50a3a30c3baa53312d864b1" + }, + { + "label": "empty payload", + "fields": { + "channelId": "aetheria.zone-1", + "schemaId": "cultmesh.realtime.v1", + "bodyId": "body-7", + "producerEpoch": 0, + "sequence": 0, + "delivery": "reliable-ordered", + "payload": "" + }, + "encoding": "Q1NUMQAAAAAAAAAAAAAAAAAAAAAADwAUAAYAAAAAACUAAAABAGFldGhlcmlhLnpvbmUtMWN1bHRtZXNoLnJlYWx0aW1lLnYxYm9keS03", + "encodedLength": 78, + "sha256OfEncoding": "06c0362f2b395bf7855522190f6a59c45c46947ce7a9a4b8be115cf54a48f419" + }, + { + "label": "multi-byte identities", + "fields": { + "channelId": "aetheria.zöne-∞", + "schemaId": "cultmesh.realtime.€1", + "bodyId": "bødy-\uD83D\uDD25", + "producerEpoch": 11, + "sequence": 12, + "delivery": "latest-only", + "payload": "cGF5bG9hZC3iiJ4=" + }, + "encoding": "Q1NUMQELAAAAAAAAAAwAAAAAAAAAEgAWAAoACwAAACUAAAABAGFldGhlcmlhLnrDtm5lLeKInmN1bHRtZXNoLnJlYWx0aW1lLuKCrDFiw7hkeS3wn5SlcGF5bG9hZC3iiJ4=", + "encodedLength": 98, + "sha256OfEncoding": "90c6ae8f1362d9e000aa57682612bb1d7606cabe2cd0c0969fdd07b816f44b1c" + }, + { + "label": "epoch and sequence at long.MaxValue", + "fields": { + "channelId": "aetheria.zone-1", + "schemaId": "cultmesh.realtime.v1", + "bodyId": "body-7", + "producerEpoch": 9223372036854775807, + "sequence": 9223372036854775807, + "delivery": "unreliable", + "payload": "Wg==" + }, + "encoding": "Q1NUMQL/////////f/////////9/DwAUAAYAAQAAACUAAAABAGFldGhlcmlhLnpvbmUtMWN1bHRtZXNoLnJlYWx0aW1lLnYxYm9keS03Wg==", + "encodedLength": 79, + "sha256OfEncoding": "208068a668b48dc1abde9b3d7f025e7f7b6de6c480faea25c1383b6de9fd37ca" + }, + { + "label": "identities at exactly 65535 UTF-8 bytes", + "fields": { + "channelId": { + "repeat": "ä€", + "byteLength": 65535 + }, + "schemaId": { + "repeat": "€ä", + "byteLength": 65535 + }, + "bodyId": { + "repeat": "ñ€", + "byteLength": 65535 + }, + "producerEpoch": 13, + "sequence": 14, + "delivery": "reliable-ordered", + "payload": "ESI=" + }, + "encoding": null, + "encodedLength": 196644, + "sha256OfEncoding": "e3c1a353b606e86b35169efb875e76349dcfcb2d036973ee3bbe3c601fbda3e1" + }, + { + "label": "64 MiB payload", + "fields": { + "channelId": "aetheria.zone-1", + "schemaId": "cultmesh.realtime.v1", + "bodyId": "body-7", + "producerEpoch": 15, + "sequence": 16, + "delivery": "reliable-ordered", + "payload": { + "ramp": 67108864 + } + }, + "encoding": null, + "encodedLength": 67108942, + "sha256OfEncoding": "4d99183bdb450af854d87a81ba86a3a4c92ecc1b208675d916f1b75a9f1e7928" + } + ], + "malformed": [ + { + "label": "truncated header", + "encoding": "Q1NUMQABAAAAAAAAAAIAAAAAAAAADwAUAAYAAwAAACUAAAAB", + "message": "Realtime frame header is truncated." + }, + { + "label": "wrong magic", + "encoding": "vFNUMQABAAAAAAAAAAIAAAAAAAAADwAUAAYAAwAAACUAAAABAGFldGhlcmlhLnpvbmUtMWN1bHRtZXNoLnJlYWx0aW1lLnYxYm9keS03CQkJ", + "message": "Realtime frame magic is invalid." + }, + { + "label": "wire version 2", + "encoding": "Q1NUMQABAAAAAAAAAAIAAAAAAAAADwAUAAYAAwAAACUAAAACAGFldGhlcmlhLnpvbmUtMWN1bHRtZXNoLnJlYWx0aW1lLnYxYm9keS03CQkJ", + "message": "Realtime frame wire version is unsupported." + }, + { + "label": "header size 36", + "encoding": "Q1NUMQABAAAAAAAAAAIAAAAAAAAADwAUAAYAAwAAACQAAAABAGFldGhlcmlhLnpvbmUtMWN1bHRtZXNoLnJlYWx0aW1lLnYxYm9keS03CQkJ", + "message": "Realtime frame wire version is unsupported." + }, + { + "label": "delivery 3", + "encoding": "Q1NUMQMBAAAAAAAAAAIAAAAAAAAADwAUAAYAAwAAACUAAAABAGFldGhlcmlhLnpvbmUtMWN1bHRtZXNoLnJlYWx0aW1lLnYxYm9keS03CQkJ", + "message": "Realtime frame delivery mode is invalid." + }, + { + "label": "delivery 255", + "encoding": "Q1NUMf8BAAAAAAAAAAIAAAAAAAAADwAUAAYAAwAAACUAAAABAGFldGhlcmlhLnpvbmUtMWN1bHRtZXNoLnJlYWx0aW1lLnYxYm9keS03CQkJ", + "message": "Realtime frame delivery mode is invalid." + }, + { + "label": "payload length -1", + "encoding": "Q1NUMQABAAAAAAAAAAIAAAAAAAAADwAUAAYAAwAAgCUAAAABAGFldGhlcmlhLnpvbmUtMWN1bHRtZXNoLnJlYWx0aW1lLnYxYm9keS03CQkJ", + "message": "Realtime frame length is invalid." + }, + { + "label": "length sum off by one", + "encoding": "Q1NUMQABAAAAAAAAAAIAAAAAAAAADwAUAAYAAwAAACUAAAABAGFldGhlcmlhLnpvbmUtMWN1bHRtZXNoLnJlYWx0aW1lLnYxYm9keS03CQkJAA==", + "message": "Realtime frame length is invalid." + } + ] +} diff --git a/contracts/cultmesh/realtime-frame-vectors.ts-written.json b/contracts/cultmesh/realtime-frame-vectors.ts-written.json new file mode 100644 index 00000000..0b987722 --- /dev/null +++ b/contracts/cultmesh/realtime-frame-vectors.ts-written.json @@ -0,0 +1,177 @@ +{ + "frames": [ + { + "label": "ts reliable-ordered, small payload", + "fields": { + "channelId": "ts.zone-a", + "schemaId": "cultmesh.realtime.v1", + "bodyId": "ts-body-1", + "producerEpoch": 21, + "sequence": 22, + "delivery": "reliable-ordered", + "payload": "AAH+/w==" + }, + "encoding": "Q1NUMQAVAAAAAAAAABYAAAAAAAAACQAUAAkABAAAACUAAAABAHRzLnpvbmUtYWN1bHRtZXNoLnJlYWx0aW1lLnYxdHMtYm9keS0xAAH+/w==", + "encodedLength": 79, + "sha256OfEncoding": "68c264a42ce34e540e9dbee31dab5b73dec98c767f0b44591ce6a477cd17fc04" + }, + { + "label": "ts latest-only, small payload", + "fields": { + "channelId": "ts.zone-a", + "schemaId": "cultmesh.realtime.v1", + "bodyId": "ts-body-1", + "producerEpoch": 23, + "sequence": 24, + "delivery": "latest-only", + "payload": "f4A=" + }, + "encoding": "Q1NUMQEXAAAAAAAAABgAAAAAAAAACQAUAAkAAgAAACUAAAABAHRzLnpvbmUtYWN1bHRtZXNoLnJlYWx0aW1lLnYxdHMtYm9keS0xf4A=", + "encodedLength": 77, + "sha256OfEncoding": "3d4f49f4aa2c1f132c3a09ee83555c13e0bc036d636524a972e2829cf417b959" + }, + { + "label": "ts unreliable, small payload", + "fields": { + "channelId": "ts.zone-a", + "schemaId": "cultmesh.realtime.v1", + "bodyId": "ts-body-1", + "producerEpoch": 25, + "sequence": 26, + "delivery": "unreliable", + "payload": "pQ==" + }, + "encoding": "Q1NUMQIZAAAAAAAAABoAAAAAAAAACQAUAAkAAQAAACUAAAABAHRzLnpvbmUtYWN1bHRtZXNoLnJlYWx0aW1lLnYxdHMtYm9keS0xpQ==", + "encodedLength": 76, + "sha256OfEncoding": "2c2faec604850959d44ee65d87d2ea59462b667c5d0db8565a8c159d75301851" + }, + { + "label": "ts empty payload", + "fields": { + "channelId": "ts.zone-a", + "schemaId": "cultmesh.realtime.v1", + "bodyId": "ts-body-1", + "producerEpoch": 0, + "sequence": 0, + "delivery": "latest-only", + "payload": "" + }, + "encoding": "Q1NUMQEAAAAAAAAAAAAAAAAAAAAACQAUAAkAAAAAACUAAAABAHRzLnpvbmUtYWN1bHRtZXNoLnJlYWx0aW1lLnYxdHMtYm9keS0x", + "encodedLength": 75, + "sha256OfEncoding": "6d2a04b399f32db4086e728194249b0279330ffa5517cdd82228f691a0f10708" + }, + { + "label": "ts multi-byte identities", + "fields": { + "channelId": "ts.zøne-∂", + "schemaId": "cultmesh.realtime.µ1", + "bodyId": "ts-bödy-🧊", + "producerEpoch": 27, + "sequence": 28, + "delivery": "unreliable", + "payload": "dHMtcGF5bG9hZC3iiII=" + }, + "encoding": "Q1NUMQIbAAAAAAAAABwAAAAAAAAADAAVAA0ADgAAACUAAAABAHRzLnrDuG5lLeKIgmN1bHRtZXNoLnJlYWx0aW1lLsK1MXRzLWLDtmR5LfCfp4p0cy1wYXlsb2FkLeKIgg==", + "encodedLength": 97, + "sha256OfEncoding": "d5d22458bd50a446c7bdce4e2598fe8e5e7bfac3646d8fcd7215363c7c5c8ca1" + }, + { + "label": "ts epoch and sequence at long.MaxValue", + "fields": { + "channelId": "ts.zone-a", + "schemaId": "cultmesh.realtime.v1", + "bodyId": "ts-body-1", + "producerEpoch": 9223372036854775807, + "sequence": 9223372036854775807, + "delivery": "reliable-ordered", + "payload": "Bw==" + }, + "encoding": "Q1NUMQD/////////f/////////9/CQAUAAkAAQAAACUAAAABAHRzLnpvbmUtYWN1bHRtZXNoLnJlYWx0aW1lLnYxdHMtYm9keS0xBw==", + "encodedLength": 76, + "sha256OfEncoding": "2abb67a876dc4ed006f33708b4c4dda55a90a6f95da7352749225195b10d45ba" + }, + { + "label": "ts identities at exactly 65535 UTF-8 bytes", + "fields": { + "channelId": { + "repeat": "ü☃", + "byteLength": 65535 + }, + "schemaId": { + "repeat": "☃ü", + "byteLength": 65535 + }, + "bodyId": { + "repeat": "ç☃", + "byteLength": 65535 + }, + "producerEpoch": 29, + "sequence": 30, + "delivery": "latest-only", + "payload": "M0Q=" + }, + "encoding": null, + "encodedLength": 196644, + "sha256OfEncoding": "8bd4cd4c5232339f76b8e394eb93b66e8d14302398ecce2ae5bdb78070ef783a" + }, + { + "label": "ts 64 MiB payload", + "fields": { + "channelId": "ts.zone-a", + "schemaId": "cultmesh.realtime.v1", + "bodyId": "ts-body-1", + "producerEpoch": 31, + "sequence": 32, + "delivery": "unreliable", + "payload": { + "ramp": 67108864 + } + }, + "encoding": null, + "encodedLength": 67108939, + "sha256OfEncoding": "f2c20e0b47a7681fbaeff6fcba024363542805de4cd95eeb7fa9f125ba646af0" + } + ], + "malformed": [ + { + "label": "ts truncated header", + "encoding": "Q1NUMQAVAAAAAAAAABYAAAAAAAAACQAUAAkABAAAACUAAAAB", + "message": "Realtime frame header is truncated." + }, + { + "label": "ts wrong magic", + "encoding": "Q1OrMQAVAAAAAAAAABYAAAAAAAAACQAUAAkABAAAACUAAAABAHRzLnpvbmUtYWN1bHRtZXNoLnJlYWx0aW1lLnYxdHMtYm9keS0xAAH+/w==", + "message": "Realtime frame magic is invalid." + }, + { + "label": "ts wire version 2", + "encoding": "Q1NUMQAVAAAAAAAAABYAAAAAAAAACQAUAAkABAAAACUAAAACAHRzLnpvbmUtYWN1bHRtZXNoLnJlYWx0aW1lLnYxdHMtYm9keS0xAAH+/w==", + "message": "Realtime frame wire version is unsupported." + }, + { + "label": "ts header size 38", + "encoding": "Q1NUMQAVAAAAAAAAABYAAAAAAAAACQAUAAkABAAAACYAAAABAHRzLnpvbmUtYWN1bHRtZXNoLnJlYWx0aW1lLnYxdHMtYm9keS0xAAH+/w==", + "message": "Realtime frame wire version is unsupported." + }, + { + "label": "ts delivery 3", + "encoding": "Q1NUMQMVAAAAAAAAABYAAAAAAAAACQAUAAkABAAAACUAAAABAHRzLnpvbmUtYWN1bHRtZXNoLnJlYWx0aW1lLnYxdHMtYm9keS0xAAH+/w==", + "message": "Realtime frame delivery mode is invalid." + }, + { + "label": "ts delivery 128", + "encoding": "Q1NUMYAVAAAAAAAAABYAAAAAAAAACQAUAAkABAAAACUAAAABAHRzLnpvbmUtYWN1bHRtZXNoLnJlYWx0aW1lLnYxdHMtYm9keS0xAAH+/w==", + "message": "Realtime frame delivery mode is invalid." + }, + { + "label": "ts payload length -1", + "encoding": "Q1NUMQAVAAAAAAAAABYAAAAAAAAACQAUAAkABAAAgCUAAAABAHRzLnpvbmUtYWN1bHRtZXNoLnJlYWx0aW1lLnYxdHMtYm9keS0xAAH+/w==", + "message": "Realtime frame length is invalid." + }, + { + "label": "ts length sum off by one", + "encoding": "Q1NUMQAVAAAAAAAAABYAAAAAAAAACQAUAAkABAAAACUAAAABAHRzLnpvbmUtYWN1bHRtZXNoLnJlYWx0aW1lLnYxdHMtYm9keS0xAAH+/wA=", + "message": "Realtime frame length is invalid." + } + ] +} diff --git a/packages/cultmesh-ts/src/index.ts b/packages/cultmesh-ts/src/index.ts index e9fbb8be..ef532359 100644 --- a/packages/cultmesh-ts/src/index.ts +++ b/packages/cultmesh-ts/src/index.ts @@ -34,6 +34,7 @@ import { type CultNetWireContract, } from "cultnet-ts"; +export * from "./realtime-wire"; export * from "./provider-session"; export * from "./provider-session-wire"; export * from "./provider-rudp-transport"; diff --git a/packages/cultmesh-ts/src/realtime-wire.ts b/packages/cultmesh-ts/src/realtime-wire.ts new file mode 100644 index 00000000..091faf08 --- /dev/null +++ b/packages/cultmesh-ts/src/realtime-wire.ts @@ -0,0 +1,178 @@ +// The one TypeScript encoding of a CultMesh realtime frame. +// +// Rule for rule, this is `CultMeshRealtimeWireProtocol` in the C# reference +// (`src/GameCult.Mesh/CultMeshRealtimeWireProtocol.cs`), over the frame shape +// `CultMeshRealtimeTransports.cs` defines. QUIC stream framing stays +// transport-owned; this file owns only the typed frame bytes and never touches +// a socket. +// +// Byte parity is proven both ways, cross-process, by two committed vector files +// under `contracts/cultmesh/`: `realtime-frame-vectors.json`, which the C# test +// `CultMeshRealtimeWireProtocolTests` writes under CULTMESH_WRITE_VECTORS=1 and +// this package's test decodes and re-encodes, and +// `realtime-frame-vectors.ts-written.json`, which +// `scripts/write-cultmesh-realtime-frame-vectors.mjs` writes with this codec and +// the same C# test decodes. A fixture authored on one side alone would only +// agree with itself. + +import { isNullOrWhiteSpaceCSharp } from "cultnet-ts"; + +/** `CultMeshRealtimeWireProtocol.ApplicationProtocolName`: the QUIC ALPN. */ +export const CULTMESH_REALTIME_ALPN = "cultmesh-state-v1"; + +/** `ConnectionCloseCode`: ASCII "CULT". A QUIC error code is 62-bit, so bigint. */ +export const CULTMESH_REALTIME_CONNECTION_CLOSE_CODE = 0x43554c54n; + +/** `StreamAbortCode`: ASCII "STAT". */ +export const CULTMESH_REALTIME_STREAM_ABORT_CODE = 0x53544154n; + +/** `ReliableStream`: the stream kind carrying `reliable-ordered`. */ +export const CULTMESH_REALTIME_RELIABLE_STREAM = 1; + +/** `LatestOnlyStream`: the stream kind carrying `latest-only`. */ +export const CULTMESH_REALTIME_LATEST_ONLY_STREAM = 2; + +/** `MaximumFrameBytes`: the payload ceiling, 64 MiB. */ +export const CULTMESH_REALTIME_MAX_PAYLOAD_BYTES = 64 * 1024 * 1024; + +/** `MaximumEncodedFrameBytes`: the payload ceiling plus the header and three maximal identities. */ +export const CULTMESH_REALTIME_MAX_ENCODED_FRAME_BYTES = + CULTMESH_REALTIME_MAX_PAYLOAD_BYTES + 37 + 3 * 0xffff; + +/** + * `CultMeshRealtimeDelivery`. The wire byte is the C# enum's ordinal, so the + * order of these three is the wire contract, not a naming choice. + */ +export type CultMeshRealtimeDelivery = "reliable-ordered" | "latest-only" | "unreliable"; + +const DELIVERY_BYTES: readonly CultMeshRealtimeDelivery[] = ["reliable-ordered", "latest-only", "unreliable"]; + +/** `CultMeshRealtimeFrame`. `producerEpoch` and `sequence` are `long` in C#, which exceeds `Number.MAX_SAFE_INTEGER`. */ +export interface CultMeshRealtimeFrame { + channelId: string; + schemaId: string; + bodyId: string; + producerEpoch: bigint; + sequence: bigint; + delivery: CultMeshRealtimeDelivery; + payload: Uint8Array; +} + +const MAGIC = 0x31545343; +const FIXED_HEADER_BYTES = 37; +const WIRE_VERSION = 1; +const MAX_IDENTITY_BYTES = 0xffff; +const INT64_MIN = -(2n ** 63n); +const INT64_MAX = 2n ** 63n - 1n; + +/** + * `CultMeshRealtimeFrame.Validate`. The C# reading of "non-empty" is + * `string.IsNullOrWhiteSpace`, whose whitespace set is not + * `String.prototype.trim`'s, so this borrows the one TypeScript implementation + * of that set from `cultnet-ts` rather than keeping a second reading here. + * + * The range check has no C# counterpart because `long` gives it for free; a + * `bigint` does not, and a `DataView` would otherwise throw a bare `RangeError` + * from inside the encoder. + */ +function validateFrame(frame: CultMeshRealtimeFrame): void { + if (isNullOrWhiteSpaceCSharp(frame.channelId)) throw new Error("Realtime channel identity is required."); + if (isNullOrWhiteSpaceCSharp(frame.schemaId)) throw new Error("Realtime schema identity is required."); + if (isNullOrWhiteSpaceCSharp(frame.bodyId)) throw new Error("Realtime body identity is required."); + if (frame.producerEpoch < 0n || frame.sequence < 0n) { + throw new Error("Realtime epoch and sequence must be non-negative."); + } + if (frame.producerEpoch > INT64_MAX || frame.sequence > INT64_MAX || frame.producerEpoch < INT64_MIN || frame.sequence < INT64_MIN) { + throw new Error("Realtime epoch and sequence must fit a 64-bit signed integer."); + } +} + +/** `CultMeshRealtimeWireProtocol.EncodeFrame`. */ +export function encodeRealtimeFrame(frame: CultMeshRealtimeFrame): Uint8Array { + validateFrame(frame); + const deliveryByte = DELIVERY_BYTES.indexOf(frame.delivery); + // C# reads an enum, which holds any byte; a TypeScript union does not, so the + // unspellable value is refused here with the message decode gives it. + if (deliveryByte < 0) throw new Error("Realtime frame delivery mode is invalid."); + const encoder = new TextEncoder(); + const channel = encoder.encode(frame.channelId); + const schema = encoder.encode(frame.schemaId); + const body = encoder.encode(frame.bodyId); + if (channel.byteLength > MAX_IDENTITY_BYTES || schema.byteLength > MAX_IDENTITY_BYTES || body.byteLength > MAX_IDENTITY_BYTES) { + throw new Error("Realtime frame identity exceeds the QUIC wire limit."); + } + if (frame.payload.byteLength > CULTMESH_REALTIME_MAX_PAYLOAD_BYTES) { + throw new Error("Realtime frame payload exceeds the QUIC wire limit."); + } + + const result = new Uint8Array( + FIXED_HEADER_BYTES + channel.byteLength + schema.byteLength + body.byteLength + frame.payload.byteLength, + ); + const view = new DataView(result.buffer); + view.setUint32(0, MAGIC, true); + result[4] = deliveryByte; + view.setBigInt64(5, frame.producerEpoch, true); + view.setBigInt64(13, frame.sequence, true); + view.setUint16(21, channel.byteLength, true); + view.setUint16(23, schema.byteLength, true); + view.setUint16(25, body.byteLength, true); + view.setInt32(27, frame.payload.byteLength, true); + view.setInt32(31, FIXED_HEADER_BYTES, true); + view.setUint16(35, WIRE_VERSION, true); + let offset = FIXED_HEADER_BYTES; + result.set(channel, offset); offset += channel.byteLength; + result.set(schema, offset); offset += schema.byteLength; + result.set(body, offset); offset += body.byteLength; + result.set(frame.payload, offset); + return result; +} + +/** + * `CultMeshRealtimeWireProtocol.DecodeFrame`, refusal for refusal and in the + * same order. Like the reference, it does not call `validateFrame`: a frame + * whose identities are blank decodes here exactly as it does in C#, and only + * encoding refuses it. + * + * One corner has no C# counterpart. The reference sums the lengths under + * `checked`, so a payload length near `int.MaxValue` throws `OverflowException` + * there rather than its length refusal; JavaScript numbers do not overflow, so + * the sum simply fails to match and the length refusal covers that case too. + * No encoder on either side can produce such a frame. + */ +export function decodeRealtimeFrame(bytes: Uint8Array): CultMeshRealtimeFrame { + if (bytes.byteLength < FIXED_HEADER_BYTES) throw new Error("Realtime frame header is truncated."); + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + if (view.getUint32(0, true) !== MAGIC) throw new Error("Realtime frame magic is invalid."); + if (view.getUint16(35, true) !== WIRE_VERSION || view.getInt32(31, true) !== FIXED_HEADER_BYTES) { + throw new Error("Realtime frame wire version is unsupported."); + } + const delivery = DELIVERY_BYTES[bytes[4]!]; + if (delivery === undefined) throw new Error("Realtime frame delivery mode is invalid."); + const channelLength = view.getUint16(21, true); + const schemaLength = view.getUint16(23, true); + const bodyLength = view.getUint16(25, true); + const payloadLength = view.getInt32(27, true); + const expected = FIXED_HEADER_BYTES + channelLength + schemaLength + bodyLength + payloadLength; + if (payloadLength < 0 || expected !== bytes.byteLength) throw new Error("Realtime frame length is invalid."); + // `Encoding.UTF8.GetString` substitutes U+FFFD for invalid bytes rather than + // throwing, which is what a non-fatal `TextDecoder` does. `ignoreBOM` is not + // cosmetic: by default `TextDecoder` *deletes* a leading U+FEFF, and + // `GetString` keeps it, so an identity starting with a byte-order mark would + // decode to a different string on the two sides. U+FEFF is not whitespace to + // .NET either, so such an identity passes the transport contract and reaches + // the wire. + const decoder = new TextDecoder("utf-8", { ignoreBOM: true }); + let offset = FIXED_HEADER_BYTES; + const channelId = decoder.decode(bytes.subarray(offset, offset + channelLength)); offset += channelLength; + const schemaId = decoder.decode(bytes.subarray(offset, offset + schemaLength)); offset += schemaLength; + const bodyId = decoder.decode(bytes.subarray(offset, offset + bodyLength)); offset += bodyLength; + return { + channelId, + schemaId, + bodyId, + producerEpoch: view.getBigInt64(5, true), + sequence: view.getBigInt64(13, true), + delivery, + payload: bytes.slice(offset, offset + payloadLength), + }; +} diff --git a/packages/cultmesh-ts/test/realtime-wire.test.ts b/packages/cultmesh-ts/test/realtime-wire.test.ts new file mode 100644 index 00000000..6a3c1a19 --- /dev/null +++ b/packages/cultmesh-ts/test/realtime-wire.test.ts @@ -0,0 +1,344 @@ +// The realtime frame codec, pinned rule by rule against the C# reference. +// +// The bytes themselves are pinned by two committed files under +// `contracts/cultmesh/`. `realtime-frame-vectors.json` is written by +// `CultMeshRealtimeWireProtocolTests.RealtimeFrameVectorsAreSharedWithTypeScript` +// under CULTMESH_WRITE_VECTORS=1: this side decodes it and re-encodes to the +// same bytes. `realtime-frame-vectors.ts-written.json` is written by +// `scripts/write-cultmesh-realtime-frame-vectors.mjs` with this codec and +// decoded by the C# reference, so parity is proven in both directions and in +// two processes. A fixture authored on one side alone would only agree with +// itself, which is what the authority vectors already taught. + +import test from "node:test"; +import assert from "node:assert/strict"; +import { createHash } from "node:crypto"; +import { readFileSync } from "node:fs"; +import { join } from "node:path"; + +import { + CULTMESH_REALTIME_ALPN, + CULTMESH_REALTIME_CONNECTION_CLOSE_CODE, + CULTMESH_REALTIME_LATEST_ONLY_STREAM, + CULTMESH_REALTIME_MAX_ENCODED_FRAME_BYTES, + CULTMESH_REALTIME_MAX_PAYLOAD_BYTES, + CULTMESH_REALTIME_RELIABLE_STREAM, + CULTMESH_REALTIME_STREAM_ABORT_CODE, + decodeRealtimeFrame, + encodeRealtimeFrame, + type CultMeshRealtimeDelivery, + type CultMeshRealtimeFrame, +} from "../src/realtime-wire"; + +const CONTRACTS = join(__dirname, "..", "..", "..", "..", "contracts", "cultmesh"); +const CSHARP_VECTORS = join(CONTRACTS, "realtime-frame-vectors.json"); +const TS_VECTORS = join(CONTRACTS, "realtime-frame-vectors.ts-written.json"); + +interface IdentityRule { repeat: string; byteLength: number } +interface RampRule { ramp: number } +interface VectorFields { + channelId: string | IdentityRule; + schemaId: string | IdentityRule; + bodyId: string | IdentityRule; + producerEpoch: number; + sequence: number; + delivery: CultMeshRealtimeDelivery; + payload: string | RampRule; +} +interface Vectors { + frames: { + label: string; + fields: VectorFields; + encoding: string | null; + encodedLength: number; + sha256OfEncoding: string; + }[]; + malformed: { label: string; encoding: string; message: string }[]; +} + +/** The repeat unit written whole until the UTF-8 byte length is exactly `byteLength`. */ +function repeatToByteLength(unit: string, byteLength: number): string { + const unitBytes = Buffer.byteLength(unit, "utf8"); + assert.equal(byteLength % unitBytes, 0, `'${unit}' is ${unitBytes} UTF-8 bytes and does not divide ${byteLength}`); + return unit.repeat(byteLength / unitBytes); +} + +/** The deterministic payload both runtimes build the same way. */ +function ramp(length: number): Uint8Array { + const bytes = new Uint8Array(length); + for (let index = 0; index < length; index += 1) bytes[index] = index % 251; + return bytes; +} + +function identity(value: string | IdentityRule): string { + return typeof value === "string" ? value : repeatToByteLength(value.repeat, value.byteLength); +} + +function payload(value: string | RampRule): Uint8Array { + return typeof value === "string" ? new Uint8Array(Buffer.from(value, "base64")) : ramp(value.ramp); +} + +function frameOf(fields: VectorFields): CultMeshRealtimeFrame { + return { + channelId: identity(fields.channelId), + schemaId: identity(fields.schemaId), + bodyId: identity(fields.bodyId), + // The C# `long` fields are written as JSON integers and can exceed the safe + // integer range, so they are read from the raw text, never through + // `JSON.parse`'s number. + producerEpoch: 0n, + sequence: 0n, + delivery: fields.delivery, + payload: payload(fields.payload), + }; +} + +// `JSON.parse` would round `long.MaxValue` to 9223372036854775808, which is not +// a valid i64 and not what either side encoded. The two i64 fields are lifted +// out of the raw text as bigints before the document is parsed. +function readVectors(path: string): { doc: Vectors; int64s: Map } { + const text = readFileSync(path, "utf8"); + const int64s = new Map(); + const pattern = /"label": "(?

+ /// The realtime frame codec, rule by rule, and the C# half of the + /// cross-runtime byte parity. contracts/cultmesh/realtime-frame-vectors.json + /// is written here under CULTMESH_WRITE_VECTORS=1 and decoded by + /// packages/cultmesh-ts/test/realtime-wire.test.ts; + /// realtime-frame-vectors.ts-written.json is written by + /// scripts/write-cultmesh-realtime-frame-vectors.mjs with the + /// TypeScript codec and judged here by the reference only. Both files carry + /// the same field shape: an identity is a string or a repeat rule, a payload + /// is base64 or a ramp rule, so one reader on each side serves both. + /// + [TestFixture] + public class CultMeshRealtimeWireProtocolTests + { + // The three identities that sit exactly on the u16 length prefix. Each + // repeat unit is five UTF-8 bytes over two characters, so 13,107 repeats + // are 65,535 bytes and 26,214 characters: byte length and character + // length differ, which is the point of the case. The vector records the + // rule and the digest of the whole encoding instead of 200 KB of literal + // identity text. + private const string WideChannelUnit = "\u00e4\u20ac"; + private const string WideSchemaUnit = "\u20ac\u00e4"; + private const string WideBodyUnit = "\u00f1\u20ac"; + private const int WideIdentityBytes = 65535; + + [Test] + public void RealtimeFrameVectorsAreSharedWithTypeScript() + { + var path = VectorPath("realtime-frame-vectors.json"); + if (Environment.GetEnvironmentVariable("CULTMESH_WRITE_VECTORS") == "1") + { + Directory.CreateDirectory(Path.GetDirectoryName(path)!); + File.WriteAllText(path, JsonSerializer.Serialize(new + { + frames = Frames().Select(Recorded).ToArray(), + malformed = Malformed().Select(entry => new + { + label = entry.Label, + encoding = Convert.ToBase64String(entry.Bytes), + message = Refusal(entry.Bytes) + }).ToArray() + }, new JsonSerializerOptions + { + WriteIndented = true, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }) + "\n"); + } + + using var vectors = JsonDocument.Parse(File.ReadAllText(path)); + var root = vectors.RootElement; + var expected = Frames().ToDictionary(entry => entry.Label); + root.GetProperty("frames").GetArrayLength().Should().Be(expected.Count); + foreach (var element in root.GetProperty("frames").EnumerateArray()) + { + var label = element.GetProperty("label").GetString()!; + expected.Should().ContainKey(label); + var frame = expected[label].Frame; + var encoded = CultMeshRealtimeWireProtocol.EncodeFrame(frame); + element.GetProperty("encodedLength").GetInt32().Should().Be(encoded.Length, label); + element.GetProperty("sha256OfEncoding").GetString().Should().Be(Sha256(encoded), label); + if (element.TryGetProperty("encoding", out var encoding) && encoding.ValueKind == JsonValueKind.String) + Convert.FromBase64String(encoding.GetString()!).Should().Equal(encoded, label); + + // The recorded fields rebuild the frame, and it round-trips. + Same(Read(element.GetProperty("fields")), frame, label); + var decoded = CultMeshRealtimeWireProtocol.DecodeFrame(encoded); + Same(decoded, frame, label); + CultMeshRealtimeWireProtocol.EncodeFrame(decoded).Should().Equal(encoded, label); + } + + var malformed = Malformed().ToDictionary(entry => entry.Label); + root.GetProperty("malformed").GetArrayLength().Should().Be(malformed.Count); + foreach (var element in root.GetProperty("malformed").EnumerateArray()) + { + var label = element.GetProperty("label").GetString()!; + malformed.Should().ContainKey(label); + var bytes = Convert.FromBase64String(element.GetProperty("encoding").GetString()!); + bytes.Should().Equal(malformed[label].Bytes, label); + Refusal(bytes).Should().Be(element.GetProperty("message").GetString(), label); + } + } + + // The other direction, cross-process: the TypeScript codec wrote these + // bytes and only the reference implementation judges them here. + [Test] + public void RealtimeFrameVectorsWrittenByTypeScriptDecodeHere() + { + var path = VectorPath("realtime-frame-vectors.ts-written.json"); + using var vectors = JsonDocument.Parse(File.ReadAllText(path)); + var frames = vectors.RootElement.GetProperty("frames"); + frames.GetArrayLength().Should().BeGreaterThan(0); + foreach (var element in frames.EnumerateArray()) + { + var label = element.GetProperty("label").GetString()!; + var frame = Read(element.GetProperty("fields")); + var mine = CultMeshRealtimeWireProtocol.EncodeFrame(frame); + + // What TypeScript wrote is what this side writes, byte for byte. + element.GetProperty("encodedLength").GetInt32().Should().Be(mine.Length, label); + element.GetProperty("sha256OfEncoding").GetString().Should().Be(Sha256(mine), label); + var theirs = element.TryGetProperty("encoding", out var encoding) && encoding.ValueKind == JsonValueKind.String + ? Convert.FromBase64String(encoding.GetString()!) + : mine; + theirs.Should().Equal(mine, label); + + // And it decodes here to the fields TypeScript claims it encoded. + Same(CultMeshRealtimeWireProtocol.DecodeFrame(theirs), frame, label); + } + + foreach (var element in vectors.RootElement.GetProperty("malformed").EnumerateArray()) + { + var label = element.GetProperty("label").GetString()!; + var bytes = Convert.FromBase64String(element.GetProperty("encoding").GetString()!); + Refusal(bytes).Should().Be(element.GetProperty("message").GetString(), label); + } + } + + [Test] + public void EncodeRefusesWhatTheTransportContractForbids() + { + Spoiled(frame => frame.ChannelId = " ").Should().Be("Realtime channel identity is required."); + Spoiled(frame => frame.SchemaId = "\t").Should().Be("Realtime schema identity is required."); + Spoiled(frame => frame.BodyId = "").Should().Be("Realtime body identity is required."); + Spoiled(frame => frame.ProducerEpoch = -1).Should().Be("Realtime epoch and sequence must be non-negative."); + Spoiled(frame => frame.Sequence = -1).Should().Be("Realtime epoch and sequence must be non-negative."); + Spoiled(frame => frame.ChannelId = new string('a', ushort.MaxValue + 1)) + .Should().Be("Realtime frame identity exceeds the QUIC wire limit."); + Spoiled(frame => frame.Payload = new byte[CultMeshRealtimeWireProtocol.MaximumFrameBytes + 1]) + .Should().Be("Realtime frame payload exceeds the QUIC wire limit."); + } + + [Test] + public void TheWireConstantsAreTheOnesTypeScriptMirrors() + { + CultMeshRealtimeWireProtocol.ApplicationProtocolName.Should().Be("cultmesh-state-v1"); + CultMeshRealtimeWireProtocol.ConnectionCloseCode.Should().Be(0x43554c54); + CultMeshRealtimeWireProtocol.StreamAbortCode.Should().Be(0x53544154); + CultMeshRealtimeWireProtocol.ReliableStream.Should().Be(1); + CultMeshRealtimeWireProtocol.LatestOnlyStream.Should().Be(2); + CultMeshRealtimeWireProtocol.MaximumFrameBytes.Should().Be(64 * 1024 * 1024); + CultMeshRealtimeWireProtocol.MaximumEncodedFrameBytes.Should().Be( + CultMeshRealtimeWireProtocol.MaximumFrameBytes + 37 + 3 * ushort.MaxValue); + ((int)CultMeshRealtimeDelivery.ReliableOrdered).Should().Be(0); + ((int)CultMeshRealtimeDelivery.LatestOnly).Should().Be(1); + ((int)CultMeshRealtimeDelivery.Unreliable).Should().Be(2); + } + + private static IEnumerable<(string Label, CultMeshRealtimeFrame Frame, bool Wide)> Frames() + { + yield return ("reliable-ordered, small payload", Frame( + "aetheria.zone-1", "cultmesh.realtime.v1", "body-7", 1, 2, + CultMeshRealtimeDelivery.ReliableOrdered, new byte[] { 0x00, 0x7f, 0x80, 0xff, 0x2a }), false); + yield return ("latest-only, small payload", Frame( + "aetheria.zone-1", "cultmesh.realtime.v1", "body-7", 3, 4, + CultMeshRealtimeDelivery.LatestOnly, new byte[] { 0x01, 0x02, 0x03 }), false); + yield return ("unreliable, small payload", Frame( + "aetheria.zone-1", "cultmesh.realtime.v1", "body-7", 5, 6, + CultMeshRealtimeDelivery.Unreliable, new byte[] { 0xfe }), false); + yield return ("empty payload", Frame( + "aetheria.zone-1", "cultmesh.realtime.v1", "body-7", 0, 0, + CultMeshRealtimeDelivery.ReliableOrdered, Array.Empty()), false); + yield return ("multi-byte identities", Frame( + "aetheria.z\u00f6ne-\u221e", "cultmesh.realtime.\u20ac1", "b\u00f8dy-\ud83d\udd25", 11, 12, + CultMeshRealtimeDelivery.LatestOnly, Encoding.UTF8.GetBytes("payload-\u221e")), false); + yield return ("epoch and sequence at long.MaxValue", Frame( + "aetheria.zone-1", "cultmesh.realtime.v1", "body-7", long.MaxValue, long.MaxValue, + CultMeshRealtimeDelivery.Unreliable, new byte[] { 0x5a }), false); + yield return ("identities at exactly 65535 UTF-8 bytes", Frame( + Repeat(WideChannelUnit, WideIdentityBytes), Repeat(WideSchemaUnit, WideIdentityBytes), + Repeat(WideBodyUnit, WideIdentityBytes), 13, 14, + CultMeshRealtimeDelivery.ReliableOrdered, new byte[] { 0x11, 0x22 }), true); + yield return ("64 MiB payload", Frame( + "aetheria.zone-1", "cultmesh.realtime.v1", "body-7", 15, 16, + CultMeshRealtimeDelivery.ReliableOrdered, Ramp(CultMeshRealtimeWireProtocol.MaximumFrameBytes)), false); + } + + private static IEnumerable<(string Label, byte[] Bytes)> Malformed() + { + var good = CultMeshRealtimeWireProtocol.EncodeFrame(Frame( + "aetheria.zone-1", "cultmesh.realtime.v1", "body-7", 1, 2, + CultMeshRealtimeDelivery.ReliableOrdered, new byte[] { 9, 9, 9 })); + yield return ("truncated header", good.Take(36).ToArray()); + yield return ("wrong magic", Spoil(good, bytes => bytes[0] ^= 0xff)); + yield return ("wire version 2", Spoil(good, bytes => bytes[35] = 2)); + yield return ("header size 36", Spoil(good, bytes => bytes[31] = 36)); + yield return ("delivery 3", Spoil(good, bytes => bytes[4] = 3)); + yield return ("delivery 255", Spoil(good, bytes => bytes[4] = 255)); + yield return ("payload length -1", Spoil(good, bytes => bytes[30] = 0x80)); + yield return ("length sum off by one", good.Concat(new byte[] { 0 }).ToArray()); + } + + private static object Recorded((string Label, CultMeshRealtimeFrame Frame, bool Wide) entry) + { + var encoded = CultMeshRealtimeWireProtocol.EncodeFrame(entry.Frame); + var frame = entry.Frame; + return new + { + label = entry.Label, + fields = new + { + channelId = entry.Wide ? Rule(WideChannelUnit, WideIdentityBytes) : frame.ChannelId, + schemaId = entry.Wide ? Rule(WideSchemaUnit, WideIdentityBytes) : frame.SchemaId, + bodyId = entry.Wide ? Rule(WideBodyUnit, WideIdentityBytes) : frame.BodyId, + producerEpoch = frame.ProducerEpoch, + sequence = frame.Sequence, + delivery = Name(frame.Delivery), + payload = frame.Payload.Length > 4096 + ? (object)new { ramp = frame.Payload.Length } + : Convert.ToBase64String(frame.Payload.ToArray()) + }, + // The two oversized cases would put megabytes into a committed + // contract file; both sides build them from the rules above and + // compare the digest of the whole encoding. + encoding = encoded.Length > 4096 ? null : Convert.ToBase64String(encoded), + encodedLength = encoded.Length, + sha256OfEncoding = Sha256(encoded) + }; + } + + private static object Rule(string unit, int byteLength) => new { repeat = unit, byteLength }; + + private static void Same(CultMeshRealtimeFrame actual, CultMeshRealtimeFrame expected, string label) + { + actual.ChannelId.Should().Be(expected.ChannelId, label); + actual.SchemaId.Should().Be(expected.SchemaId, label); + actual.BodyId.Should().Be(expected.BodyId, label); + actual.ProducerEpoch.Should().Be(expected.ProducerEpoch, label); + actual.Sequence.Should().Be(expected.Sequence, label); + actual.Delivery.Should().Be(expected.Delivery, label); + actual.Payload.Length.Should().Be(expected.Payload.Length, label); + actual.Payload.Span.SequenceEqual(expected.Payload.Span).Should().BeTrue(label); + } + + private static CultMeshRealtimeFrame Read(JsonElement fields) => new() + { + ChannelId = Identity(fields.GetProperty("channelId")), + SchemaId = Identity(fields.GetProperty("schemaId")), + BodyId = Identity(fields.GetProperty("bodyId")), + ProducerEpoch = fields.GetProperty("producerEpoch").GetInt64(), + Sequence = fields.GetProperty("sequence").GetInt64(), + Delivery = Delivery(fields.GetProperty("delivery").GetString()!), + Payload = Payload(fields.GetProperty("payload")) + }; + + private static string Identity(JsonElement element) => + element.ValueKind == JsonValueKind.String + ? element.GetString()! + : Repeat(element.GetProperty("repeat").GetString()!, element.GetProperty("byteLength").GetInt32()); + + private static byte[] Payload(JsonElement element) => + element.ValueKind == JsonValueKind.String + ? Convert.FromBase64String(element.GetString()!) + : Ramp(element.GetProperty("ramp").GetInt32()); + + /// The repeat unit written whole until the UTF-8 byte length is exactly . + private static string Repeat(string unit, int byteLength) + { + var unitBytes = Encoding.UTF8.GetByteCount(unit); + if (byteLength % unitBytes != 0) + throw new ArgumentException($"'{unit}' is {unitBytes} UTF-8 bytes and does not divide {byteLength}."); + return string.Concat(Enumerable.Repeat(unit, byteLength / unitBytes)); + } + + /// A deterministic payload both runtimes build the same way. + private static byte[] Ramp(int length) + { + var bytes = new byte[length]; + for (var index = 0; index < length; index++) bytes[index] = (byte)(index % 251); + return bytes; + } + + private static string Spoiled(Action spoil) + { + var frame = Frame("c", "s", "b", 1, 2, CultMeshRealtimeDelivery.ReliableOrdered, new byte[] { 1 }); + spoil(frame); + try + { + CultMeshRealtimeWireProtocol.EncodeFrame(frame); + return ""; + } + catch (Exception error) + { + return error.Message; + } + } + + private static string Refusal(byte[] bytes) + { + try + { + CultMeshRealtimeWireProtocol.DecodeFrame(bytes); + return ""; + } + catch (Exception error) + { + return error.Message; + } + } + + private static byte[] Spoil(byte[] bytes, Action spoil) + { + var copy = bytes.ToArray(); + spoil(copy); + return copy; + } + + private static CultMeshRealtimeFrame Frame( + string channelId, string schemaId, string bodyId, long producerEpoch, long sequence, + CultMeshRealtimeDelivery delivery, byte[] payload) => + new() + { + ChannelId = channelId, + SchemaId = schemaId, + BodyId = bodyId, + ProducerEpoch = producerEpoch, + Sequence = sequence, + Delivery = delivery, + Payload = payload + }; + + private static string Name(CultMeshRealtimeDelivery delivery) => delivery switch + { + CultMeshRealtimeDelivery.ReliableOrdered => "reliable-ordered", + CultMeshRealtimeDelivery.LatestOnly => "latest-only", + CultMeshRealtimeDelivery.Unreliable => "unreliable", + _ => throw new ArgumentOutOfRangeException(nameof(delivery)) + }; + + private static CultMeshRealtimeDelivery Delivery(string name) => name switch + { + "reliable-ordered" => CultMeshRealtimeDelivery.ReliableOrdered, + "latest-only" => CultMeshRealtimeDelivery.LatestOnly, + "unreliable" => CultMeshRealtimeDelivery.Unreliable, + _ => throw new ArgumentOutOfRangeException(nameof(name), name, "unknown delivery") + }; + + private static string Sha256(byte[] bytes) => Convert.ToHexString(SHA256.HashData(bytes)).ToLowerInvariant(); + + private static string VectorPath(string name) => Path.Combine(RepoRoot(), "contracts", "cultmesh", name); + + private static string RepoRoot() + { + var directory = new DirectoryInfo(TestContext.CurrentContext.TestDirectory); + while (directory != null && !File.Exists(Path.Combine(directory.FullName, "CultLib.sln"))) + directory = directory.Parent; + return directory?.FullName ?? throw new InvalidOperationException("CultLib.sln was not found above the test directory."); + } + } +} From ae29910b30281998560c377ec77ee70f900612b4 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 19:20:57 +0200 Subject: [PATCH 49/94] Mutate the realtime frame codec, one mutation per rule A third target in the committed runner, `realtime`, over `packages/cultmesh-ts/src/realtime-wire.ts`, killed by that package's own suite. It gets the machinery the other two already have: a no-op control through the same write path, the sidecar and its verified restore, and the post-restore rebuild that proves `dist/` no longer carries a mutant, with `0x31545343` as the sentinel its last mutation removes. Thirty-seven mutations, one per rule the codec owns: each header field's offset, width and endianness; the field order the reference fixed; the magic, the stamped header size and wire version; the delivery ordinal; UTF-8 identities and byte-counting length prefixes; the identity and payload ceilings; the ALPN, the two QUIC error codes and the two stream kinds; the four encode refusals from the transport contract; each decode refusal and the order they fire in; the byte-order mark; and the two aliasing rules, that decode reads only the viewed bytes of an offset view and that the decoded payload does not alias the frame. A mutation that changes the encoding symmetrically still dies, because the vector bytes were written on the other side. All seventy-two mutations across the three targets are killed and all three controls are green. One mutant is not listed and says why in the table, as the P1363 length guard already did: removing `payloadLength < 0` from the decoder's length refusal is equivalent. The clause mirrors the reference but cannot fire alone, because reaching it means the frame is already 37 bytes and a negative length can then never make the sum match. It survived when tried. Co-Authored-By: Claude Fable 5.1 --- scripts/mutate-cultmesh-authority.mjs | 55 +++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/scripts/mutate-cultmesh-authority.mjs b/scripts/mutate-cultmesh-authority.mjs index 8aec4eee..f7df540b 100644 --- a/scripts/mutate-cultmesh-authority.mjs +++ b/scripts/mutate-cultmesh-authority.mjs @@ -49,6 +49,12 @@ const targets = { dist: join(repoRoot, "packages", "cultmesh-browser", "dist", "index.js"), sentinel: "isUnsignedCertificate(route.certificate)", }, + realtime: { + workspace: "packages/cultmesh-ts", + file: join(repoRoot, "packages", "cultmesh-ts", "src", "realtime-wire.ts"), + dist: join(repoRoot, "packages", "cultmesh-ts", "dist", "realtime-wire.js"), + sentinel: "0x31545343", + }, }; const mutations = [ @@ -256,6 +262,55 @@ const mutations = [ old: "isUnsignedCertificate(route.certificate)", new: '(route.certificate?.signature ?? "") === ""', }, + // The realtime frame codec. Every rule the cut map names for it gets one + // mutation; the killer is `npm run test --workspace packages/cultmesh-ts`, + // whose vectors are written by the C# reference and by this codec in turn. + // A mutation that changes the encoding symmetrically (an endianness flip, a + // field swap) still dies, because the vector bytes came from the other side. + { target: "realtime", rule: "the header is little-endian", old: "view.setUint32(0, MAGIC, true);", new: "view.setUint32(0, MAGIC, false);" }, + { target: "realtime", rule: "the delivery byte sits at offset 4", old: " result[4] = deliveryByte;\n", new: " result[5] = deliveryByte;\n" }, + { target: "realtime", rule: "the producer epoch is written before the sequence", old: " view.setBigInt64(5, frame.producerEpoch, true);\n view.setBigInt64(13, frame.sequence, true);\n", new: " view.setBigInt64(5, frame.sequence, true);\n view.setBigInt64(13, frame.producerEpoch, true);\n" }, + { target: "realtime", rule: "the epoch and sequence are 64-bit, not 32-bit", old: " view.setBigInt64(5, frame.producerEpoch, true);", new: " view.setInt32(5, Number(frame.producerEpoch), true);" }, + { target: "realtime", rule: "the three identity lengths are written channel, schema, body", old: " view.setUint16(23, schema.byteLength, true);\n view.setUint16(25, body.byteLength, true);\n", new: " view.setUint16(23, body.byteLength, true);\n view.setUint16(25, schema.byteLength, true);\n" }, + { target: "realtime", rule: "the identity length prefixes are 16-bit, not 8-bit", old: " view.setUint16(21, channel.byteLength, true);", new: " view.setUint8(21, channel.byteLength);" }, + { target: "realtime", rule: "the identity length prefixes are little-endian", old: " view.setUint16(21, channel.byteLength, true);", new: " view.setUint16(21, channel.byteLength, false);" }, + { target: "realtime", rule: "the payload length prefix sits at offset 27", old: " view.setInt32(27, frame.payload.byteLength, true);", new: " view.setInt32(28, frame.payload.byteLength, true);" }, + { target: "realtime", rule: "the header size is stamped into the frame", old: " view.setInt32(31, FIXED_HEADER_BYTES, true);", new: " view.setInt32(31, FIXED_HEADER_BYTES + 1, true);" }, + { target: "realtime", rule: "the wire version is stamped into the frame", old: " view.setUint16(35, WIRE_VERSION, true);", new: " view.setUint16(35, WIRE_VERSION + 1, true);" }, + { target: "realtime", rule: "the identities are written channel, schema, body, then the payload", old: " result.set(channel, offset); offset += channel.byteLength;\n result.set(schema, offset); offset += schema.byteLength;\n", new: " result.set(schema, offset); offset += schema.byteLength;\n result.set(channel, offset); offset += channel.byteLength;\n" }, + { target: "realtime", rule: "the fixed header is 37 bytes", old: "const FIXED_HEADER_BYTES = 37;", new: "const FIXED_HEADER_BYTES = 38;" }, + { target: "realtime", rule: "delivery encodes as the C# enum ordinal, reliable-ordered first", old: 'const DELIVERY_BYTES: readonly CultMeshRealtimeDelivery[] = ["reliable-ordered", "latest-only", "unreliable"];', new: 'const DELIVERY_BYTES: readonly CultMeshRealtimeDelivery[] = ["latest-only", "reliable-ordered", "unreliable"];' }, + { target: "realtime", rule: "an identity the delivery union cannot spell is refused", old: ' if (deliveryByte < 0) throw new Error("Realtime frame delivery mode is invalid.");\n', new: "" }, + { target: "realtime", rule: "identities are UTF-8, and the prefix counts bytes not characters", old: " const channel = encoder.encode(frame.channelId);", new: " const channel = Uint8Array.from(frame.channelId, c => c.charCodeAt(0) & 0xff);" }, + { target: "realtime", rule: "an identity over 65535 bytes is refused", old: " if (channel.byteLength > MAX_IDENTITY_BYTES || schema.byteLength > MAX_IDENTITY_BYTES || body.byteLength > MAX_IDENTITY_BYTES) {\n throw new Error(\"Realtime frame identity exceeds the QUIC wire limit.\");\n }\n", new: "" }, + { target: "realtime", rule: "a payload over the 64 MiB ceiling is refused", old: " if (frame.payload.byteLength > CULTMESH_REALTIME_MAX_PAYLOAD_BYTES) {\n throw new Error(\"Realtime frame payload exceeds the QUIC wire limit.\");\n }\n", new: "" }, + { target: "realtime", rule: "the payload ceiling is 64 MiB", old: "export const CULTMESH_REALTIME_MAX_PAYLOAD_BYTES = 64 * 1024 * 1024;", new: "export const CULTMESH_REALTIME_MAX_PAYLOAD_BYTES = 32 * 1024 * 1024;" }, + { target: "realtime", rule: "the encoded ceiling covers the header and three maximal identities", old: " CULTMESH_REALTIME_MAX_PAYLOAD_BYTES + 37 + 3 * 0xffff;", new: " CULTMESH_REALTIME_MAX_PAYLOAD_BYTES + 37 + 0xffff;" }, + { target: "realtime", rule: "the ALPN is cultmesh-state-v1", old: 'export const CULTMESH_REALTIME_ALPN = "cultmesh-state-v1";', new: 'export const CULTMESH_REALTIME_ALPN = "cultmesh-state-v2";' }, + { target: "realtime", rule: "the QUIC connection close and stream abort codes", old: "export const CULTMESH_REALTIME_CONNECTION_CLOSE_CODE = 0x43554c54n;", new: "export const CULTMESH_REALTIME_CONNECTION_CLOSE_CODE = 0x53544154n;" }, + { target: "realtime", rule: "the two stream kinds are 1 and 2", old: "export const CULTMESH_REALTIME_RELIABLE_STREAM = 1;", new: "export const CULTMESH_REALTIME_RELIABLE_STREAM = 2;" }, + { target: "realtime", rule: "a blank channel identity is refused, on C#'s whitespace set", old: ' if (isNullOrWhiteSpaceCSharp(frame.channelId)) throw new Error("Realtime channel identity is required.");\n', new: "" }, + { target: "realtime", rule: "the blank reading is C#'s IsNullOrWhiteSpace, not String.prototype.trim", old: " if (isNullOrWhiteSpaceCSharp(frame.schemaId)) throw new Error", new: ' if (frame.schemaId.trim() === "") throw new Error' }, + { target: "realtime", rule: "a blank body identity is refused", old: ' if (isNullOrWhiteSpaceCSharp(frame.bodyId)) throw new Error("Realtime body identity is required.");\n', new: "" }, + { target: "realtime", rule: "a negative epoch or sequence is refused", old: " if (frame.producerEpoch < 0n || frame.sequence < 0n) {", new: " if (false) {" }, + { target: "realtime", rule: "an epoch or sequence outside the i64 range is refused", old: " if (frame.producerEpoch > INT64_MAX || frame.sequence > INT64_MAX || frame.producerEpoch < INT64_MIN || frame.sequence < INT64_MIN) {", new: " if (false) {" }, + { target: "realtime", rule: "decode refuses a truncated header", old: ' if (bytes.byteLength < FIXED_HEADER_BYTES) throw new Error("Realtime frame header is truncated.");\n', new: "" }, + { target: "realtime", rule: "decode checks the magic", old: ' if (view.getUint32(0, true) !== MAGIC) throw new Error("Realtime frame magic is invalid.");\n', new: "" }, + { target: "realtime", rule: "decode checks the wire version", old: " if (view.getUint16(35, true) !== WIRE_VERSION || view.getInt32(31, true) !== FIXED_HEADER_BYTES) {", new: " if (view.getInt32(31, true) !== FIXED_HEADER_BYTES) {" }, + { target: "realtime", rule: "decode checks the stamped header size", old: " if (view.getUint16(35, true) !== WIRE_VERSION || view.getInt32(31, true) !== FIXED_HEADER_BYTES) {", new: " if (view.getUint16(35, true) !== WIRE_VERSION) {" }, + { target: "realtime", rule: "decode refuses a delivery byte outside the three modes", old: ' if (delivery === undefined) throw new Error("Realtime frame delivery mode is invalid.");\n', new: ' if (delivery === undefined) return { channelId: "", schemaId: "", bodyId: "", producerEpoch: 0n, sequence: 0n, delivery: "unreliable", payload: new Uint8Array(0) };\n' }, + // Not listed: removing `payloadLength < 0` from the decoder's length refusal. + // The clause mirrors the reference but cannot fire on its own: a negative + // payload length makes the sum smaller than the frame, and reaching the sum + // check at all means the frame is already at least 37 bytes, so the sum can + // never match while the length is negative. The mutant is equivalent, and it + // survived when tried. + { target: "realtime", rule: "decode refuses a length sum that misses the frame", old: " if (payloadLength < 0 || expected !== bytes.byteLength) throw", new: " if (payloadLength < 0) throw" }, + { target: "realtime", rule: "decode keeps a leading byte-order mark, as Encoding.UTF8.GetString does", old: 'const decoder = new TextDecoder("utf-8", { ignoreBOM: true });', new: "const decoder = new TextDecoder();" }, + { target: "realtime", rule: "decode reads exactly the viewed bytes of an offset view", old: " const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);", new: " const view = new DataView(bytes.buffer);" }, + { target: "realtime", rule: "the decoded payload does not alias the frame it came from", old: " payload: bytes.slice(offset, offset + payloadLength),", new: " payload: bytes.subarray(offset, offset + payloadLength)," }, + // Last, because it removes this target's sentinel. + { target: "realtime", rule: "the frame magic is 0x31545343", old: "const MAGIC = 0x31545343;", new: "const MAGIC = 0x31545344;" }, ]; function digest(bytes) { From fef767d34a4687a2ca5e4eb6fc040878a7a6d05d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 19:24:11 +0200 Subject: [PATCH 50/94] Record Cut 2's landing The frame codec exists with parity proven both ways from its first commit, and its test found a real divergence before any consumer could: the JavaScript decoder deletes a leading byte-order mark the .NET decoder keeps. Two housekeeping rulings taken: the aggregate TypeScript scripts have been broken by a rename for two days and get their one-word fix, and the mutation runner is renamed for what it now covers. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 31 +++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index 4a76e87e..d0ca96d2 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -15,7 +15,36 @@ question is open. **Cut 1 landed** at `e234a64` (shared verifier, tests, C#-written vectors), `66286b9` (browser copy deleted, −143 net) and `062a5c6` (mutation runner; twelve killed, one equivalent), then three Soul passes and three fix batches; **closed 2026-09-16**, three residuals -carried into Cut 2's Hands pass. **Cut 2 in Hands.** +landed at `c64a2da`, `6c933d0`, `fe2555d`. + +**Cut 2 landed** at `6cbc73f` (the codec, 178 lines; C#-written and +TypeScript-written frame vectors, each decoded by the other side, the C# +test reading both with the reference alone) and `ae29910` (37 entries as a +third runner target; 72 of 72 across the three targets killed, one +equivalent named). Soul in flight. Hands' discrepancies, kept: the +65,535-byte identity and 64 MiB payload ceilings recorded as a build rule +plus the digest of the whole encoding rather than half a megabyte of +literal text; the Body has five refusal messages where the spec listed six +(negative length and length-sum mismatch share one); three refusals added +that C#'s type system gives free, among them **a real divergence found by +the test: `TextDecoder` deletes a leading U+FEFF where +`Encoding.UTF8.GetString` keeps it, and U+FEFF is not .NET whitespace, so +such an identity passes `Validate` and reaches the wire**, closed with +`ignoreBOM`; C# sums lengths under `checked` and TS covers the overflow +with its length refusal, unreachable from either encoder. Residual 1's +exact-equality verification could not hold as written: applying the +pre-check leaves eleven stricter-than-C# spellings, all the safe direction, +pinned by name, because exact agreement needs .NET's registered-scheme +table. The no-control-byte test caught a literal U+001F the Write tool put +into its own introducing comment. + +Two items for Self's ruling, both taken: **`npm run test:ts` and `build:ts` +have been broken since `8dd5a45` (2026-09-14)** because +`scripts/run-typescript-workspaces.mjs:9` names the old unscoped +`cultcache-ts`; one-word fix, lands in Cut 2's fix batch. **The runner is +still named `mutate-cultmesh-authority.mjs`** while carrying a codec +target; it is renamed `scripts/mutate-cultmesh.mjs` in the same batch and +this map's references follow. **Cut 1 Soul findings, 2026-09-16.** Held: every test count, both negative greps, all twelve mutations rerun and killed, the control catching a From 343dffc1de82cb41d34e449330183aee190a3a37 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 19:58:50 +0200 Subject: [PATCH 51/94] Record Soul's Cut 2 pass and correct one attribution Byte parity held both ways under Soul's own frames. Three small things did not: a mutant declared equivalent was not, the payload copy is a view for a Node buffer, and the frame parity has no CI executor. The breakage of the aggregate scripts dates from the scoped rename, not the version bump this map first named. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 43 ++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index d0ca96d2..f8fa0d0c 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -39,12 +39,43 @@ table. The no-control-byte test caught a literal U+001F the Write tool put into its own introducing comment. Two items for Self's ruling, both taken: **`npm run test:ts` and `build:ts` -have been broken since `8dd5a45` (2026-09-14)** because -`scripts/run-typescript-workspaces.mjs:9` names the old unscoped -`cultcache-ts`; one-word fix, lands in Cut 2's fix batch. **The runner is -still named `mutate-cultmesh-authority.mjs`** while carrying a codec -target; it is renamed `scripts/mutate-cultmesh.mjs` in the same batch and -this map's references follow. +have been broken since `8cb3b72`** (the scoped rename; Hands first +attributed it to `8dd5a45`, which only bumped a version, and Soul +corrected it) because `scripts/run-typescript-workspaces.mjs:9` names the +old unscoped `cultcache-ts`; one-word fix, lands in Cut 2's fix batch. +**The runner is still named `mutate-cultmesh-authority.mjs`** while +carrying a codec target; it is renamed `scripts/mutate-cultmesh.mjs` in +the same batch and this map's references follow. + +**Soul's pass on Cut 2** (Fable; probes `probe-cs/`, `parity.mjs`, +`symmetric.mjs` and others in the session scratchpad) held byte parity in +both directions over its own thirty-nine encode specs and thirty +hand-built byte strings: identical digests, identical refusal messages, +identical U+FFFD counts on invalid UTF-8, the byte-order mark round trip, +all four digest ceilings regenerated from their build rules on both sides, +the five decode refusals in the same order, and every symmetric two-site +mutant dead. **Cut 2 does not close as promised**, on three small findings +in the fix batch: + +- **The mutant Hands called equivalent is not.** A 37-byte frame whose + identity lengths cancel a negative payload length sums to exactly 37 and + decodes to blank identities where C# refuses. The clause is right; nothing + defended it. Medium. +- **The decoded payload aliases the frame when the input is a Node + `Buffer`**, because `Buffer.prototype.slice` is a view; the test used only + a `Uint8Array`. The same trap the repo recorded for `verifyP256`. Medium + for the bridge, nil today. +- **Neither half of the frame parity runs in CI**; a C# codec change leaves + everything green. The Cut 1 scar, repeated. Medium. + +Recorded, not defects: the reference encoder writes delivery values its +own decoder refuses (a cast on the enum), where TypeScript refuses at +encode, the stricter side; an overflow near `int.MaxValue` is reachable +from hostile bytes and refused on both sides with different words; the +runner's sentinel detects only the last mutant by design, and the sidecar +repair names the mutation a dead run was inside. **Cut 3 may start in +parallel**, provided the first two land before the bridge hands the codec +a `Buffer`; both are in the same Hands pass ahead of it. **Cut 1 Soul findings, 2026-09-16.** Held: every test count, both negative greps, all twelve mutations rerun and killed, the control catching a From 65f2b666ef2196fc3c3373f8546cf84aee879d07 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 20:19:49 +0200 Subject: [PATCH 52/94] Run the TypeScript workspaces by the name cultcache-ts actually has MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `npm run build:ts` and `test:ts` have been dead since 8cb3b72, not 8dd5a45 as first recorded. That commit renamed the package to @gamecult/cultcache-ts and left `run-typescript-workspaces.mjs` asking npm for a workspace called `cultcache-ts`, which no longer exists; npm refused at the first entry in the list, so neither script reached any workspace at all. npm resolves a workspace by manifest name, not directory, so the list moves whenever a package is scoped — said out loud in the source now, since nothing else will say it. The mutation runner is renamed `scripts/mutate-cultmesh.mjs`. It stopped being about the route verifier alone when cut 2 gave it a third target, the realtime frame codec, and a file named for one of its three targets invites the reader to assume the other two are somebody else's problem. `docs/typescript-quic-realtime-cut.md:46-47` names the old path; the map is Self's and is updated separately. Co-Authored-By: Claude Fable 5.1 --- ...tate-cultmesh-authority.mjs => mutate-cultmesh.mjs} | 10 +++++++--- scripts/run-typescript-workspaces.mjs | 6 +++++- 2 files changed, 12 insertions(+), 4 deletions(-) rename scripts/{mutate-cultmesh-authority.mjs => mutate-cultmesh.mjs} (98%) diff --git a/scripts/mutate-cultmesh-authority.mjs b/scripts/mutate-cultmesh.mjs similarity index 98% rename from scripts/mutate-cultmesh-authority.mjs rename to scripts/mutate-cultmesh.mjs index f7df540b..1752c657 100644 --- a/scripts/mutate-cultmesh-authority.mjs +++ b/scripts/mutate-cultmesh.mjs @@ -1,6 +1,7 @@ -// Mutation check for the CultMesh route verification rules. +// Mutation check for the CultMesh rules TypeScript owns: route verification and +// the realtime frame codec. // -// Two files own those rules and each is one target here. `shared` is +// Two files own the route rules and each is one target here. `shared` is // `packages/cultnet-ts/src/cultmesh-authority.ts`, the one verifier, killed by // `npm run test --workspace packages/cultnet-ts`. `browser` is // `packages/cultmesh-browser/src/index.ts`, which must *call* the shared rules @@ -20,7 +21,10 @@ // that sidecar by the next run, not by git. After the final restore each // package is rebuilt so `dist/` never carries the last mutant. // -// node scripts/mutate-cultmesh-authority.mjs +// `realtime` is `packages/cultmesh-ts/src/realtime-wire.ts`, the frame codec, +// killed by `npm run test --workspace packages/cultmesh-ts`. +// +// node scripts/mutate-cultmesh.mjs import { createHash } from "node:crypto"; import { execFileSync } from "node:child_process"; diff --git a/scripts/run-typescript-workspaces.mjs b/scripts/run-typescript-workspaces.mjs index 933079da..da881464 100644 --- a/scripts/run-typescript-workspaces.mjs +++ b/scripts/run-typescript-workspaces.mjs @@ -6,7 +6,11 @@ if (!command) throw new Error("Usage: node scripts/run-typescript-workspaces.mjs const npmCli = process.env.npm_execpath ?? join(dirname(process.execPath), "node_modules", "npm", "bin", "npm-cli.js"); -const workspaces = ["cultcache-ts", "cultnet-ts", "cultmesh-ts", "cultmesh-browser"]; +// npm resolves a workspace by its manifest name, not its directory, so this list +// moves when a package is scoped: `8cb3b72` renamed `cultcache-ts` to +// `@gamecult/cultcache-ts` and left this entry behind, which broke `build:ts` and +// `test:ts` for every workspace from that commit on. +const workspaces = ["@gamecult/cultcache-ts", "cultnet-ts", "cultmesh-ts", "cultmesh-browser"]; const childEnv = process.platform === "win32" ? { ...process.env, From 9a4c9396b431307f77139f8e9eba3eaa51b588cd Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 20:20:16 +0200 Subject: [PATCH 53/94] Stop the realtime decoder handing back a view of its own frame MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two mutants the cut-2 pass recorded as equivalent were not. Both notes were reasoning, and both were wrong in the same way: they argued from the shape of the code instead of trying the input that breaks it. The decoder's length refusal reads `payloadLength < 0 || expected !== length`. The note said the first clause could never fire on its own, because a negative payload length makes the sum smaller than the frame. It does not: the sum also carries the three identity lengths, and a negative payload cancels against them. A 37-byte frame declaring `channelLength=65535, payloadLength=-65535` sums to exactly 37, matches its own byte length, and without the clause decodes to three blank identities and an empty payload where `CultMeshRealtimeWireProtocol` refuses it. Two smaller spellings do the same, `ch=1, pl=-1` over 37 bytes and `ch=2, pl=-1` over 38. No test covered that shape; one does now, and the mutation is listed and killed rather than excused. The payload copy was worse, because the fix and the bug looked identical. The decoder used `bytes.slice(...)`, which copies a `Uint8Array` — and the existing test passes one, so it was green — but Node's `Buffer` overrides `slice` with an alias of `subarray`. A `Buffer` is what a socket read hands a Node caller, which is exactly how the QUIC plane in cut 4 will reach this function, so every decoded payload would have been a live view of a frame buffer the transport is free to reuse. `Uint8Array.prototype.slice.call(bytes, ...)` was the obvious repair and does copy, but `%TypedArray%.prototype.slice` takes its result constructor from `@@species`, and `Buffer`'s is `FastBuffer`: the payload then comes back a `Buffer` from a `Buffer` frame and a `Uint8Array` from a `Uint8Array` one, so the same frame compares equal or unequal under `deepStrictEqual` depending on how it arrived. `new Uint8Array(bytes.subarray(...))` copies and is one type on both. Three mutations now guard the line — return a view, return a `Buffer` view, return a species-typed copy — and the first two die only on their own input type. Mutation runner: 75 mutations, 75 killed, 0 survivors, three green controls. Co-Authored-By: Claude Fable 5.1 --- packages/cultmesh-ts/src/realtime-wire.ts | 15 +++++- .../cultmesh-ts/test/realtime-wire.test.ts | 53 +++++++++++++++++++ scripts/mutate-cultmesh.mjs | 24 ++++++--- 3 files changed, 84 insertions(+), 8 deletions(-) diff --git a/packages/cultmesh-ts/src/realtime-wire.ts b/packages/cultmesh-ts/src/realtime-wire.ts index 091faf08..fa647133 100644 --- a/packages/cultmesh-ts/src/realtime-wire.ts +++ b/packages/cultmesh-ts/src/realtime-wire.ts @@ -173,6 +173,19 @@ export function decodeRealtimeFrame(bytes: Uint8Array): CultMeshRealtimeFrame { producerEpoch: view.getBigInt64(5, true), sequence: view.getBigInt64(13, true), delivery, - payload: bytes.slice(offset, offset + payloadLength), + // Not `bytes.slice(...)`. Node's `Buffer` overrides `slice` with an alias of + // `subarray`, so on a `Buffer` — which is what every socket read hands a Node + // caller — that spelling returns a *view* of the frame, and a decoded payload + // that changes when the frame buffer is reused. + // + // Nor `Uint8Array.prototype.slice.call(bytes, ...)`, which does bypass the + // override and copy, but takes its result constructor from `@@species`: on a + // `Buffer` that is `FastBuffer`, so the payload comes back a `Buffer` from a + // `Buffer` frame and a `Uint8Array` from a `Uint8Array` one. The declared + // type holds either way, but `deepStrictEqual` does not, so the same frame + // would compare equal or not depending on how it reached the decoder. + // + // The constructor copies and is the one type on both inputs. + payload: new Uint8Array(bytes.subarray(offset, offset + payloadLength)), }; } diff --git a/packages/cultmesh-ts/test/realtime-wire.test.ts b/packages/cultmesh-ts/test/realtime-wire.test.ts index 6a3c1a19..93f23365 100644 --- a/packages/cultmesh-ts/test/realtime-wire.test.ts +++ b/packages/cultmesh-ts/test/realtime-wire.test.ts @@ -325,6 +325,43 @@ test("decode refuses every malformed frame the reference refuses, in the referen assert.equal(decodeRealtimeFrame(blank).channelId, " ".repeat(15)); }); +// The `payloadLength < 0` clause in the length refusal is not redundant with the +// sum check beside it, which is what a surviving mutant that dropped it claimed. +// A negative payload length cancels against the identity lengths, so a frame can +// be crafted whose sum lands exactly on its own byte length. Without the clause +// each of these decodes to blank identities and an empty payload where the C# +// reference (`CultMeshRealtimeWireProtocol.cs:74-76`, same clause) refuses. +test("decode refuses a negative payload length that the length sum cancels out", () => { + const good = encodeRealtimeFrame(sample()); + // A valid magic, wire version, header size and delivery byte, then the three + // identity lengths and the payload length written by hand. + const crafted = (channelLength: number, payloadLength: number, totalBytes: number) => { + const bytes = new Uint8Array(totalBytes); + bytes.set(good.subarray(0, 37), 0); + const view = new DataView(bytes.buffer); + view.setUint16(21, channelLength, true); + view.setUint16(23, 0, true); + view.setUint16(25, 0, true); + view.setInt32(27, payloadLength, true); + // The sum the decoder computes must land exactly on the frame's own length, + // or the check beside the clause would refuse it and prove nothing. + assert.equal(37 + channelLength + 0 + 0 + payloadLength, totalBytes, "the crafted sum must match"); + return bytes; + }; + const cases: readonly (readonly [string, Uint8Array])[] = [ + ["a maximal channel length cancelled by -65535, summing to 37", crafted(0xffff, -0xffff, 37)], + ["a channel length of 1 cancelled by -1, summing to 37", crafted(1, -1, 37)], + ["a channel length of 2 cancelled by -1, summing to 38", crafted(2, -1, 38)], + ]; + for (const [label, bytes] of cases) { + assert.throws( + () => decodeRealtimeFrame(bytes), + (error: Error) => error.message === "Realtime frame length is invalid.", + label, + ); + } +}); + test("decode reads exactly the viewed bytes of an offset view, not the buffer behind it", () => { const good = encodeRealtimeFrame(sample({ payload: Uint8Array.from([9, 8, 7]) })); const pool = new Uint8Array(good.byteLength + 64).fill(0xa5); @@ -338,6 +375,22 @@ test("decode reads exactly the viewed bytes of an offset view, not the buffer be assert.deepEqual(decoded.payload, Uint8Array.from([9, 8, 7])); }); +// The `Uint8Array` case above passes with a plain `bytes.slice(...)`; this one +// does not. Node's `Buffer` overrides `slice` with an alias of `subarray`, and a +// `Buffer` is what a socket read hands a Node caller, so the aliasing bug this +// pins is the one that would actually reach a consumer. +test("the decoded payload copies out of a Node Buffer too, which overrides slice", () => { + const frame = Buffer.from(encodeRealtimeFrame(sample({ payload: Uint8Array.from([9, 8, 7]) }))); + const decoded = decodeRealtimeFrame(frame); + frame[frame.byteLength - 1] = 0; + assert.deepEqual(decoded.payload, Uint8Array.from([9, 8, 7]), "payload unchanged by a later write to the frame"); + assert.equal(Buffer.isBuffer(decoded.payload), false, "the copy is a plain Uint8Array, not a Buffer"); + assert.notEqual(decoded.payload.buffer, frame.buffer, "the copy has its own backing store"); + // The three identities need no such check: `TextDecoder` returns strings, which + // hold no reference to the bytes they were decoded from. + assert.equal(decoded.channelId, "aetheria.zone-1"); +}); + test("the codec touches no socket: no node: import in the source", () => { const source = readFileSync(join(__dirname, "..", "..", "src", "realtime-wire.ts"), "utf8"); assert.doesNotMatch(source, /from "node:|require\("node:/); diff --git a/scripts/mutate-cultmesh.mjs b/scripts/mutate-cultmesh.mjs index 1752c657..d3d3f7e9 100644 --- a/scripts/mutate-cultmesh.mjs +++ b/scripts/mutate-cultmesh.mjs @@ -303,16 +303,26 @@ const mutations = [ { target: "realtime", rule: "decode checks the wire version", old: " if (view.getUint16(35, true) !== WIRE_VERSION || view.getInt32(31, true) !== FIXED_HEADER_BYTES) {", new: " if (view.getInt32(31, true) !== FIXED_HEADER_BYTES) {" }, { target: "realtime", rule: "decode checks the stamped header size", old: " if (view.getUint16(35, true) !== WIRE_VERSION || view.getInt32(31, true) !== FIXED_HEADER_BYTES) {", new: " if (view.getUint16(35, true) !== WIRE_VERSION) {" }, { target: "realtime", rule: "decode refuses a delivery byte outside the three modes", old: ' if (delivery === undefined) throw new Error("Realtime frame delivery mode is invalid.");\n', new: ' if (delivery === undefined) return { channelId: "", schemaId: "", bodyId: "", producerEpoch: 0n, sequence: 0n, delivery: "unreliable", payload: new Uint8Array(0) };\n' }, - // Not listed: removing `payloadLength < 0` from the decoder's length refusal. - // The clause mirrors the reference but cannot fire on its own: a negative - // payload length makes the sum smaller than the frame, and reaching the sum - // check at all means the frame is already at least 37 bytes, so the sum can - // never match while the length is negative. The mutant is equivalent, and it - // survived when tried. { target: "realtime", rule: "decode refuses a length sum that misses the frame", old: " if (payloadLength < 0 || expected !== bytes.byteLength) throw", new: " if (payloadLength < 0) throw" }, + // This one was first listed as equivalent — "a negative payload length makes + // the sum smaller than the frame, so the sum check covers it" — and it did + // survive. The reasoning was wrong: a negative payload length cancels against + // the identity lengths, so a 37-byte frame with channelLength 65535 and + // payloadLength -65535 sums to exactly 37 and decoded to blank identities + // while the reference refused it. No test covered that shape; one does now. + { target: "realtime", rule: "decode refuses a negative payload length the sum cancels out", old: " if (payloadLength < 0 || expected !== bytes.byteLength) throw", new: " if (expected !== bytes.byteLength) throw" }, { target: "realtime", rule: "decode keeps a leading byte-order mark, as Encoding.UTF8.GetString does", old: 'const decoder = new TextDecoder("utf-8", { ignoreBOM: true });', new: "const decoder = new TextDecoder();" }, { target: "realtime", rule: "decode reads exactly the viewed bytes of an offset view", old: " const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);", new: " const view = new DataView(bytes.buffer);" }, - { target: "realtime", rule: "the decoded payload does not alias the frame it came from", old: " payload: bytes.slice(offset, offset + payloadLength),", new: " payload: bytes.subarray(offset, offset + payloadLength)," }, + { target: "realtime", rule: "the decoded payload does not alias the frame it came from", old: " payload: new Uint8Array(bytes.subarray(offset, offset + payloadLength)),", new: " payload: bytes.subarray(offset, offset + payloadLength)," }, + // The narrower half of the same rule, and the one that shipped broken: a plain + // `bytes.slice` copies a `Uint8Array` but aliases a `Buffer`, whose own `slice` + // is an alias of `subarray`. The mutation above dies on the `Uint8Array` test; + // this one survives it and dies only on the `Buffer` test. + { target: "realtime", rule: "the decoded payload copies out of a Buffer, whose own slice is a view", old: " payload: new Uint8Array(bytes.subarray(offset, offset + payloadLength)),", new: " payload: bytes.slice(offset, offset + payloadLength)," }, + // And the payload's type does not follow the frame's. This spelling copies, so + // both mutations above are dead to it, but `@@species` hands a `Buffer` frame a + // `Buffer` payload; only the `Buffer.isBuffer` assertion kills it. + { target: "realtime", rule: "the decoded payload is a plain Uint8Array whatever the frame was", old: " payload: new Uint8Array(bytes.subarray(offset, offset + payloadLength)),", new: " payload: Uint8Array.prototype.slice.call(bytes, offset, offset + payloadLength)," }, // Last, because it removes this target's sentinel. { target: "realtime", rule: "the frame magic is 0x31545343", old: "const MAGIC = 0x31545343;", new: "const MAGIC = 0x31545344;" }, ]; From 6ed0ff75af5ecd8daa6e563a8fd3a97180e7b7b3 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 20:21:27 +0200 Subject: [PATCH 54/94] Run both halves of the realtime frame parity in CI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The codec's byte parity rests on two vector files written from opposite sides: `realtime-frame-vectors.json` by the C# reference and decoded by TypeScript, and `realtime-frame-vectors.ts-written.json` by the TypeScript codec and decoded by C#. Neither half ran in CI. The TypeScript suite ran nowhere — cultmesh-ts was not in any job — and the C# test ran nowhere either, because `cultnet-interop.yml` is windows-latest and main-only and does not filter for it. A codec that agreed only with itself would have gone green on every push, which is the exact failure the two-file scheme exists to prevent. Both now run in the `reactive-and-resource-lifetime` job beside the authority steps, on windows-latest and ubuntu-latest, for main, codex/** and pull requests. That job was already the one place the TypeScript side of CultMesh gets exercised on Linux at all. Co-Authored-By: Claude Fable 5.1 --- .github/workflows/cultmesh-portability.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/cultmesh-portability.yml b/.github/workflows/cultmesh-portability.yml index 9f088e95..520a4836 100644 --- a/.github/workflows/cultmesh-portability.yml +++ b/.github/workflows/cultmesh-portability.yml @@ -109,6 +109,15 @@ jobs: - name: Verify the browser client against the shared TypeScript verifier run: npm run test --workspace packages/cultmesh-browser + # The realtime frame codec. Its byte parity rests on two vector files, + # contracts/cultmesh/realtime-frame-vectors.json written by the C# + # reference and decoded by this step, and realtime-frame-vectors.ts-written.json + # written by this codec and decoded by the C# step below. Neither half ran + # in CI on any OS until these two steps existed, so a codec that agreed + # only with itself would have gone green. + - name: Verify the realtime frame codec with the TypeScript codec + run: npm run test --workspace packages/cultmesh-ts + # Both directions of the CultMesh authority vectors: the C#-written # file (contracts/cultmesh/authority-route-vectors.json) and the # TypeScript-signed file (authority-route-vectors.ts-signed.json) are @@ -120,3 +129,12 @@ jobs: dotnet test tests/GameCult.Mesh.Tests/GameCult.Mesh.Tests.csproj --filter FullyQualifiedName~AuthorityProof --logger "console;verbosity=minimal" + + # The other half of the frame parity: the C# reference decodes and + # re-encodes the vector file the TypeScript codec wrote. A fixture + # authored on one side alone would only agree with itself. + - name: Verify the realtime frame vectors with the C# reference + run: >- + dotnet test tests/GameCult.Mesh.Tests/GameCult.Mesh.Tests.csproj + --filter FullyQualifiedName~RealtimeWireProtocol + --logger "console;verbosity=minimal" From 7a0749b8e2004f364bd44cbc8e14278895e39d30 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 20:21:42 +0200 Subject: [PATCH 55/94] Say what the eleven stricter endpoint spellings actually are MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both comments around `STRICTER_THAN_CSHARP` called the divergences host repairs. Most are not. Of the eleven, three carry a backslash and two have no authority for `System.Uri` to accept; `refusedByCSharpUriShape` refuses those five on the raw string, before there is a host to repair. Four are genuine host repairs `URL` would make and C# would not — two trailing dots, two fullwidth hosts — and the last two throw in `URL` before any rule of ours runs. The same slip sits in `isProtectedEndpoint`'s own doc comment, over a different eleven: it says `URL` repairs eleven spellings `System.Uri` refuses, when only the four carrying a tab or CR/LF are rewritten and the other seven are admitted as written. Wording only; no rule changes. It matters because the next reader deciding whether the pre-check earns its keep will reach for the reason the comment gives, and "host repairs" points at the wrong half of the list. Co-Authored-By: Claude Fable 5.1 --- packages/cultnet-ts/src/cultmesh-authority.ts | 16 +++++++++------- .../cultnet-ts/test/cultmesh-authority.test.ts | 18 ++++++++++++------ 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/packages/cultnet-ts/src/cultmesh-authority.ts b/packages/cultnet-ts/src/cultmesh-authority.ts index d61f6072..31cbcb61 100644 --- a/packages/cultnet-ts/src/cultmesh-authority.ts +++ b/packages/cultnet-ts/src/cultmesh-authority.ts @@ -366,14 +366,16 @@ export function isLoopbackEndpoint(value: string): boolean { * scheme containing "quic", over a string `System.Uri` parses at all. * * `refusedByCSharpUriShape` runs first here for the same reason it runs first in - * `isLoopbackEndpoint`, and it matters more: `URL` repairs eleven spellings + * `isLoopbackEndpoint`, and it matters more: `URL` accepts eleven spellings * `System.Uri` refuses outright, and every one of them would be *protected* here - * and unprotected in C#. `wss:x`, `wss:host`, `wss:host:8443`, `wss:/host` and - * `wss:///host` have no authority for `System.Uri` to accept; `wss://host\path` - * and `wss://host:8443\` carry a backslash; `wss://ho\tst/m`, `wss://host\t/m`, - * `quic://ho\tst` carry a tab and `wss://host\r\n/m` a CR/LF, which `URL` - * deletes. Letting any of them answer true would clear the channel-protection - * gate on a route C# refuses. + * and unprotected in C#. Only four of the eleven are repairs in the sense of + * `URL` rewriting the host: `wss://ho\tst/m`, `wss://host\t/m` and + * `quic://ho\tst` carry a tab and `wss://host\r\n/m` a CR/LF, all of which `URL` + * deletes. The other seven `URL` simply admits as written: `wss:x`, `wss:host`, + * `wss:host:8443`, `wss:/host` and `wss:///host` have no authority for + * `System.Uri` to accept, and `wss://host\path` and `wss://host:8443\` carry a + * backslash. Letting any of the eleven answer true would clear the + * channel-protection gate on a route C# refuses. * * Two spellings of Soul's 71 still disagree, both the safe way round: C# calls * them protected and this answers false, so a route is refused rather than diff --git a/packages/cultnet-ts/test/cultmesh-authority.test.ts b/packages/cultnet-ts/test/cultmesh-authority.test.ts index dbf5a8d7..e0c47234 100644 --- a/packages/cultnet-ts/test/cultmesh-authority.test.ts +++ b/packages/cultnet-ts/test/cultmesh-authority.test.ts @@ -390,12 +390,18 @@ const CSHARP_PROTECTED_ANSWERS: readonly (readonly [string, boolean])[] = [ // The eleven of the 71 where the two sides still differ, every one of them the // safe way round: C# calls the endpoint protected and TypeScript does not, so a -// route is refused rather than admitted. `refusedByCSharpUriShape` is stricter -// than `System.Uri.TryCreate` on purpose — it also refuses the host repairs that -// would make `isLoopbackEndpoint` lie — and a zone id and a non-breaking-space -// host throw in `URL` before any rule of ours runs. None of them is dialable as -// a browser CultMesh route. Pinned exactly, not merely excluded: if one of these -// starts answering true, or a twelfth spelling joins them, this fails. +// route is refused rather than admitted. They are not one shape. Three carry a +// backslash (`wss:\\host/m`, `wss://host:8443/\`, `QUIC:\\host`) and two have no +// authority for `System.Uri` to accept (`quic:host`, `quic:`); those five +// `refusedByCSharpUriShape` refuses on the raw string, before any host exists to +// repair. Four are host repairs `URL` would make and C# would not — a trailing +// dot on `wss://host./m` and `wss://127.0.0.1./m`, a fullwidth host on the other +// two — which is the same reason that pre-check runs first in +// `isLoopbackEndpoint`. The last two throw in `URL` before any rule of ours +// runs: an IPv6 zone id and a non-breaking space in the host. None of the eleven +// is dialable as a browser CultMesh route. Pinned exactly, not merely excluded: +// if one of these starts answering true, or a twelfth spelling joins them, this +// fails. const STRICTER_THAN_CSHARP: readonly string[] = [ "wss:\\\\host/m", "wss://host./m", From 6a091ef65c62c721733b95e37b55fbe240ce0e59 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 21:03:01 +0200 Subject: [PATCH 56/94] Make the MsQuic bridge a two-role event queue instead of a Unity client MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The bridge was one platform, one role and one host: Windows by construction (`windows.h`, `__declspec`, `CryptHashCertificate2`), client-only, and shaped around the managed connector that polls it every 2 ms. Nothing about MsQuic required that; the shape came from having exactly one caller. It now carries a C ABI v2 of twelve exports over a single per-runtime event queue: open a runtime, open listeners and connections on it, open streams and send frames, and take typed events out of one blocking wait. The event struct is 64 bytes described by layout rather than by a shared header, so a host declares it in its own FFI and no header travels with the ABI. `next_event` keeps the v1 two-phase convention — return 2, leave the event at the head, report the size the caller needs — because that is the one part of v1 that was already host-agnostic. The rule that shapes everything else is that nothing calls out. MsQuic's worker threads only push onto the queue and wake that wait, so no host runtime is entered from a thread it does not own, and the bridge needs to know nothing about what is on the other side. That is what makes one binary serve both a Node process through FFI and a Unity player through P/Invoke. Trust moved out. A v2 client connection defers validation, emits the DER as event 3 and answers MsQuic only when the host calls `connection_certificate_complete`; if the host never answers, MsQuic's handshake timeout closes the connection and event 4 says so. The C code no longer has an opinion about certificates — except in the v1 shim, where it must. The five v1 exports are unchanged in signature and behaviour and are now `#ifdef _WIN32`, matching `CanConnect`'s own Windows gate. A v1 client is a private v2 runtime holding one connection, and the pin comparison is the single thing it still decides in C, because that is the contract the shipped Unity package was built against. `windows.h`, `wincrypt.h` and `CryptHashCertificate2` appear nowhere outside that block. Two things the rewrite had to get right that the old shape never exercised. The v1 pin must be attached before `ConnectionStart`, not after it returns: the handshake runs on an MsQuic worker thread and reaches the certificate event immediately on loopback, so a pin applied afterwards loses the race and the connection silently takes the host path nobody is listening on. And teardown must close the connection handles itself — `RegistrationClose` blocks until the app has closed every child handle, and a silent shutdown delivers no shutdown events at all, so leaning on the callbacks to do it deadlocks the caller forever. Both were found by the tests hanging, and both now have a mutation that reproduces them. Verified: the four v1 tests in tests/GameCult.Mesh.Quic.Native.Tests pass unchanged (3 passed, 1 skipped for want of an external endpoint), including the wrong-pin refusal and the departed-client broadcast test. A 15-check FFI smoke drives the whole v2 path — listener, deferred certificate, both sides connected, latest-only stream, one frame with FIN, identical bytes out — and passes on Windows x64 and on Linux x64. Ten source mutations, ten killed, two green no-op controls. One open fork, reported separately and not decided here: the pinned Windows MsQuic is the Schannel build, which refuses QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12 with QUIC_STATUS_NOT_SUPPORTED, so `listener_open` cannot open a provider against it. The map assumed PKCS12 was "one credential type for Schannel and OpenSSL"; the header declares it but the Schannel provider does not implement it. The identical bridge binary passes the full provider smoke against OpenSSL MsQuic 2.5.9, so this is a question about which flavour Windows pins, not about the bridge. Co-Authored-By: Claude Fable 5.1 --- .../GameCult.Mesh.Quic.Native/CMakeLists.txt | 51 +- .../cultmesh_quic_native.cpp | 1380 +++++++++++++---- 2 files changed, 1092 insertions(+), 339 deletions(-) diff --git a/native/GameCult.Mesh.Quic.Native/CMakeLists.txt b/native/GameCult.Mesh.Quic.Native/CMakeLists.txt index dcb3014c..da92ffb1 100644 --- a/native/GameCult.Mesh.Quic.Native/CMakeLists.txt +++ b/native/GameCult.Mesh.Quic.Native/CMakeLists.txt @@ -1,23 +1,48 @@ cmake_minimum_required(VERSION 3.24) project(gamecult_mesh_quic_native LANGUAGES CXX) -if(NOT WIN32) - message(FATAL_ERROR "The current CultMesh native QUIC connector supports Windows desktop only") -endif() -if(NOT DEFINED MSQUIC_ROOT) - message(FATAL_ERROR "MSQUIC_ROOT must point at the extracted Microsoft.Native.Quic.MsQuic.Schannel package build/native directory") +# Two platforms, one source. Windows takes MsQuic from the pinned Schannel NuGet +# layout (MSQUIC_ROOT); Linux takes it from the extracted libmsquic deb, whose +# headers and library land in unrelated places, so they are named separately. +if(NOT WIN32 AND NOT (CMAKE_SYSTEM_NAME STREQUAL "Linux")) + message(FATAL_ERROR "The CultMesh native QUIC bridge supports Windows x64 and Linux x64") endif() add_library(gamecult_mesh_quic_native SHARED cultmesh_quic_native.cpp) target_compile_features(gamecult_mesh_quic_native PRIVATE cxx_std_20) -target_compile_definitions(gamecult_mesh_quic_native PRIVATE GAMECULT_MESH_QUIC_NATIVE_EXPORTS WIN32_LEAN_AND_MEAN NOMINMAX) -target_include_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_ROOT}/include") -target_link_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_ROOT}/lib/x64") -target_link_libraries(gamecult_mesh_quic_native PRIVATE msquic crypt32 bcrypt) -# The DLL is committed beside its source, so a rebuild must reproduce it: /Brepro drops the link timestamps. -target_compile_options(gamecult_mesh_quic_native PRIVATE /Brepro) -target_link_options(gamecult_mesh_quic_native PRIVATE /Brepro) + +if(WIN32) + if(NOT DEFINED MSQUIC_ROOT) + message(FATAL_ERROR "MSQUIC_ROOT must point at the extracted Microsoft.Native.Quic.MsQuic.Schannel package build/native directory") + endif() + target_compile_definitions(gamecult_mesh_quic_native PRIVATE WIN32_LEAN_AND_MEAN NOMINMAX) + target_include_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_ROOT}/include") + target_link_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_ROOT}/lib/x64") + # crypt32 and bcrypt belong to the v1 shim alone: CryptHashCertificate2 + # compares the Unity pin. Nothing in the v2 path needs them. ntdll carries + # RtlIpv4/6StringToAddressEx, which msquic_winuser.h's inline QuicAddrFromString + # calls to parse the listener host; the Linux header parses it in-tree instead. + target_link_libraries(gamecult_mesh_quic_native PRIVATE msquic crypt32 bcrypt ntdll) + # The DLL is committed beside its source, so a rebuild must reproduce it: /Brepro drops the link timestamps. + target_compile_options(gamecult_mesh_quic_native PRIVATE /Brepro) + target_link_options(gamecult_mesh_quic_native PRIVATE /Brepro) +else() + if(NOT DEFINED MSQUIC_INCLUDE_DIR OR NOT DEFINED MSQUIC_LIB_DIR) + message(FATAL_ERROR "MSQUIC_INCLUDE_DIR and MSQUIC_LIB_DIR must point at the msquic v2.5.9 headers and the extracted libmsquic library directory") + endif() + target_include_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_INCLUDE_DIR}") + target_link_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_LIB_DIR}") + target_link_libraries(gamecult_mesh_quic_native PRIVATE msquic pthread) + # Only the CULTMESH_API exports leave the .so; everything else stays internal. + target_compile_options(gamecult_mesh_quic_native PRIVATE -fvisibility=hidden -fvisibility-inlines-hidden) + # libmsquic.so.2 ships beside the bridge rather than being installed + # system-wide, so the loader is pointed at the bridge's own directory. + set_target_properties(gamecult_mesh_quic_native PROPERTIES + BUILD_WITH_INSTALL_RPATH TRUE + INSTALL_RPATH "$ORIGIN") +endif() set_target_properties(gamecult_mesh_quic_native PROPERTIES OUTPUT_NAME "gamecult_mesh_quic_native" - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") diff --git a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp index bbb6e193..8c2e8884 100644 --- a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp +++ b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp @@ -1,8 +1,29 @@ -#include -#include -#include +// The CultMesh MsQuic bridge: one MsQuic body, two roles, two platforms. +// +// This file owns MsQuic registration, configuration, listener, connection and +// stream handles, TLS credential loading, the 1-byte-kind plus 4-byte-LE-length +// QUIC stream framing, and a single event queue per runtime. It owns transport +// only. It never decodes a CultMesh frame, never decides delivery semantics, +// never coalesces, never reconnects, and in the v2 path never accepts a +// certificate on its own: the host answers, through +// `cultmesh_quic_connection_certificate_complete`. +// +// No host callbacks. Every crossing is the host calling in, including the one +// blocking wait (`cultmesh_quic_next_event`). MsQuic's worker threads only ever +// push onto the queue and wake that wait, so the bridge is runtime-neutral: it +// includes no Node headers, no Unity headers, and nothing platform-specific +// outside the `_WIN32` block at the bottom of this file. +// +// Two ABIs live here. v2 is the queue API above, for any host. v1 is the five +// exports the Unity managed connector already imports by name +// (`CultMeshNativeQuicRealtimeTransport.cs`, `NativeMethods`), kept Windows-only +// and implemented on top of a private v2 runtime. v1 is the only place a +// certificate pin is compared in C, because that is the contract Unity was +// shipped with; it delegates everything else and decides nothing new. + #include +#include #include #include #include @@ -13,14 +34,31 @@ #include #include #include +#include #include -#if defined(GAMECULT_MESH_QUIC_NATIVE_EXPORTS) +#if defined(_WIN32) #define CULTMESH_API extern "C" __declspec(dllexport) #else -#define CULTMESH_API extern "C" __declspec(dllimport) +#define CULTMESH_API extern "C" __attribute__((visibility("default"))) #endif +// The event struct crosses the ABI by layout, not by header: hosts describe it +// in their own FFI. Keep it exactly 64 bytes with no implicit padding. +extern "C" struct cultmesh_quic_event { + uint32_t type; + uint32_t stream_kind; + uint64_t listener_id; + uint64_t connection_id; + uint64_t stream_id; + uint64_t code; + int32_t status; + int32_t payload_length; + uint8_t reserved[16]; +}; +static_assert(sizeof(cultmesh_quic_event) == 64, "the event struct is a 64-byte ABI contract"); +static_assert(offsetof(cultmesh_quic_event, payload_length) == 44, "event field offsets are an ABI contract"); + namespace { constexpr uint32_t kApiVersion = 2; @@ -31,6 +69,903 @@ constexpr uint8_t kLatestOnlyStream = 2; constexpr uint32_t kMaximumEncodedFrameBytes = (64u * 1024u * 1024u) + 37u + (3u * 65535u); constexpr char kAlpn[] = "cultmesh-state-v1"; +// Mirrors the C# server and connector: CultMeshQuicRealtimeTransport.cs:77,:202 +// for the stream ceiling, and the idle/keep-alive pair the v1 bridge already +// used (:335-338). +constexpr uint32_t kIdleTimeoutMs = 30000; +constexpr uint32_t kKeepAliveIntervalMs = 5000; +constexpr uint16_t kPeerUnidiStreamCount = 1024; +// If the host never answers the certificate event, this is what closes the +// connection instead of leaking it: MsQuic's own handshake timeout fires and +// the shutdown arrives as event 4. +constexpr uint32_t kHandshakeIdleTimeoutMs = 10000; + +enum EventType : uint32_t { + kEventListenerNewConnection = 1, + kEventConnectionConnected = 2, + kEventConnectionCertificateReceived = 3, + kEventConnectionShutdown = 4, + kEventStreamStarted = 5, + kEventStreamFrame = 6, + kEventStreamSendComplete = 7, + kEventStreamShutdown = 8, + kEventListenerStopped = 9, +}; + +struct Runtime; +struct Connection; + +struct QueuedEvent { + cultmesh_quic_event header{}; + std::vector payload; +}; + +struct Stream { + Runtime* runtime = nullptr; + Connection* owner = nullptr; + HQUIC handle = nullptr; + uint64_t id = 0; + uint8_t kind = 0; + bool inbound = false; + bool has_kind = false; + // Inbound reassembly only. MsQuic delivers stream bytes in arbitrary + // chunks, so the length prefix and the frame it introduces can arrive in + // separate receives. + std::vector buffered; +}; + +struct Connection { + Runtime* runtime = nullptr; + HQUIC handle = nullptr; + uint64_t id = 0; + uint64_t listener_id = 0; + bool inbound = false; + bool closing = false; + // Two paths can reach `ConnectionClose`: the shutdown-complete callback and + // `cultmesh_quic_runtime_close`, which cannot lean on the callback because a + // silent shutdown produces none. Whoever gets here first closes; the other + // does nothing. MsQuic treats a second close of the same handle as a bug. + std::atomic handle_closed{false}; + // v1 only. A connection carrying a pin has its certificate answered in C + // against that pin; a v2 connection never sets this and is always answered + // by the host. Nothing outside the `_WIN32` block below ever sets it. + bool has_pin = false; + std::array pin{}; + // v1 diagnostics: the MsQuic event sequence, which the v1 error string + // reports and nothing in v2 reads. + std::string trace; +}; + +struct Listener { + Runtime* runtime = nullptr; + HQUIC handle = nullptr; + HQUIC configuration = nullptr; + uint64_t id = 0; + bool stopped = false; +}; + +struct Runtime { + const QUIC_API_TABLE* api = nullptr; + HQUIC registration = nullptr; + // One client configuration serves every outbound connection: the ALPN, + // settings and credential flags are identical for all of them. + HQUIC client_configuration = nullptr; + + std::mutex gate; + std::condition_variable signal; + std::deque events; + std::unordered_map> listeners; + std::unordered_map> connections; + std::unordered_map> streams; + uint64_t next_id = 1; + std::string error; + bool closing = false; +}; + +// Every send buffer outlives its `StreamSend` call: MsQuic reads the bytes +// asynchronously and only releases them at SEND_COMPLETE, where this is freed. +struct SendRequest { + QUIC_BUFFER buffer{}; + std::vector bytes; +}; + +std::string Hex(uint64_t value) { + std::ostringstream text; + text << "0x" << std::hex << std::uppercase << value; + return text.str(); +} + +void SetError(Runtime* runtime, const std::string& message) { + if (runtime == nullptr) return; + std::lock_guard lock(runtime->gate); + runtime->error = message; +} + +// The only way anything reaches the host. Callers must not hold `gate`. +void Publish(Runtime* runtime, const cultmesh_quic_event& header, const uint8_t* payload, size_t payload_length) { + QueuedEvent queued; + queued.header = header; + queued.header.payload_length = static_cast(payload_length); + if (payload != nullptr && payload_length > 0) + queued.payload.assign(payload, payload + payload_length); + { + std::lock_guard lock(runtime->gate); + if (runtime->closing) return; + runtime->events.push_back(std::move(queued)); + } + runtime->signal.notify_all(); +} + +void PublishSimple(Runtime* runtime, uint32_t type, uint64_t listener_id, uint64_t connection_id, + uint64_t stream_id, uint64_t code, int32_t status, uint32_t stream_kind = 0) { + cultmesh_quic_event header{}; + header.type = type; + header.stream_kind = stream_kind; + header.listener_id = listener_id; + header.connection_id = connection_id; + header.stream_id = stream_id; + header.code = code; + header.status = status; + Publish(runtime, header, nullptr, 0); +} + +void AppendTrace(Connection* connection, const std::string& event) { + if (connection == nullptr) return; + std::lock_guard lock(connection->runtime->gate); + if (!connection->trace.empty()) connection->trace += ","; + connection->trace += event; +} + +uint32_t ReadUInt32LittleEndian(const uint8_t* value) { + return static_cast(value[0]) | + (static_cast(value[1]) << 8) | + (static_cast(value[2]) << 16) | + (static_cast(value[3]) << 24); +} + +void WriteUInt32LittleEndian(uint8_t* destination, uint32_t value) { + destination[0] = static_cast(value & 0xff); + destination[1] = static_cast((value >> 8) & 0xff); + destination[2] = static_cast((value >> 16) & 0xff); + destination[3] = static_cast((value >> 24) & 0xff); +} + +uint64_t NextId(Runtime* runtime) { + std::lock_guard lock(runtime->gate); + return runtime->next_id++; +} + +Listener* FindListener(Runtime* runtime, uint64_t id) { + std::lock_guard lock(runtime->gate); + const auto found = runtime->listeners.find(id); + return found == runtime->listeners.end() ? nullptr : found->second.get(); +} + +Connection* FindConnection(Runtime* runtime, uint64_t id) { + std::lock_guard lock(runtime->gate); + const auto found = runtime->connections.find(id); + return found == runtime->connections.end() ? nullptr : found->second.get(); +} + +Stream* FindStream(Runtime* runtime, uint64_t id) { + std::lock_guard lock(runtime->gate); + const auto found = runtime->streams.find(id); + return found == runtime->streams.end() ? nullptr : found->second.get(); +} + +void ShutdownConnectionForProtocolFault(Connection* connection, const std::string& message) { + if (connection == nullptr) return; + SetError(connection->runtime, message); + if (connection->runtime->api != nullptr && connection->handle != nullptr) + connection->runtime->api->ConnectionShutdown( + connection->handle, QUIC_CONNECTION_SHUTDOWN_FLAG_NONE, kStreamAbortCode); +} + +// Reassembles whole encoded frames out of the stream byte sequence and +// publishes one event 6 per frame, length prefix stripped. The first byte of an +// inbound stream is its kind, which becomes event 5. +bool ConsumeFrames(Stream* stream) { + Runtime* runtime = stream->runtime; + auto& bytes = stream->buffered; + if (!stream->has_kind) { + if (bytes.empty()) return true; + stream->kind = bytes.front(); + bytes.erase(bytes.begin()); + stream->has_kind = true; + if (stream->kind != kReliableStream && stream->kind != kLatestOnlyStream) { + ShutdownConnectionForProtocolFault(stream->owner, "CultMesh QUIC stream kind is invalid."); + return false; + } + PublishSimple(runtime, kEventStreamStarted, stream->owner->listener_id, stream->owner->id, + stream->id, 0, 0, stream->kind); + } + + while (bytes.size() >= sizeof(uint32_t)) { + const uint32_t length = ReadUInt32LittleEndian(bytes.data()); + if (length == 0 || length > kMaximumEncodedFrameBytes) { + ShutdownConnectionForProtocolFault(stream->owner, "CultMesh QUIC frame length is invalid."); + return false; + } + const size_t framed_length = sizeof(uint32_t) + static_cast(length); + if (bytes.size() < framed_length) return true; + + cultmesh_quic_event header{}; + header.type = kEventStreamFrame; + header.stream_kind = stream->kind; + header.listener_id = stream->owner->listener_id; + header.connection_id = stream->owner->id; + header.stream_id = stream->id; + Publish(runtime, header, bytes.data() + sizeof(uint32_t), length); + + bytes.erase(bytes.begin(), bytes.begin() + static_cast(framed_length)); + } + return true; +} + +void DestroyStream(Runtime* runtime, uint64_t stream_id) { + std::lock_guard lock(runtime->gate); + runtime->streams.erase(stream_id); +} + +QUIC_STATUS QUIC_API StreamCallback(HQUIC handle, void* context, QUIC_STREAM_EVENT* event) { + auto* stream = static_cast(context); + Runtime* runtime = stream->runtime; + switch (event->Type) { + case QUIC_STREAM_EVENT_RECEIVE: + for (uint32_t index = 0; index < event->RECEIVE.BufferCount; ++index) { + const auto& buffer = event->RECEIVE.Buffers[index]; + stream->buffered.insert(stream->buffered.end(), buffer.Buffer, buffer.Buffer + buffer.Length); + } + ConsumeFrames(stream); + break; + case QUIC_STREAM_EVENT_SEND_COMPLETE: + delete static_cast(event->SEND_COMPLETE.ClientContext); + PublishSimple(runtime, kEventStreamSendComplete, stream->owner->listener_id, stream->owner->id, + stream->id, 0, 0, stream->kind); + break; + case QUIC_STREAM_EVENT_PEER_SEND_SHUTDOWN: + if (!stream->buffered.empty()) + ShutdownConnectionForProtocolFault(stream->owner, "CultMesh QUIC stream ended with a truncated frame."); + break; + case QUIC_STREAM_EVENT_SHUTDOWN_COMPLETE: { + const uint64_t stream_id = stream->id; + const uint64_t connection_id = stream->owner->id; + const uint64_t listener_id = stream->owner->listener_id; + const uint32_t kind = stream->kind; + if (!event->SHUTDOWN_COMPLETE.AppCloseInProgress) runtime->api->StreamClose(handle); + DestroyStream(runtime, stream_id); + PublishSimple(runtime, kEventStreamShutdown, listener_id, connection_id, stream_id, 0, 0, kind); + break; + } + default: + break; + } + return QUIC_STATUS_SUCCESS; +} + +void DestroyConnection(Runtime* runtime, uint64_t connection_id) { + std::lock_guard lock(runtime->gate); + for (auto it = runtime->streams.begin(); it != runtime->streams.end();) + it = it->second->owner != nullptr && it->second->owner->id == connection_id + ? runtime->streams.erase(it) + : std::next(it); + runtime->connections.erase(connection_id); +} + +#if defined(_WIN32) +// Declared here, defined in the v1 block at the bottom: the pin comparison is +// the one piece of the certificate path that is Windows-only and v1-only. +bool CertificateMatchesPin(Connection* connection, QUIC_CERTIFICATE* certificate); +#endif + +QUIC_STATUS QUIC_API ConnectionCallback(HQUIC handle, void* context, QUIC_CONNECTION_EVENT* event) { + auto* connection = static_cast(context); + Runtime* runtime = connection->runtime; + AppendTrace(connection, "event=" + std::to_string(static_cast(event->Type))); + switch (event->Type) { + case QUIC_CONNECTION_EVENT_CONNECTED: + PublishSimple(runtime, kEventConnectionConnected, connection->listener_id, connection->id, 0, 0, 0); + break; + case QUIC_CONNECTION_EVENT_PEER_STREAM_STARTED: { + auto stream = std::make_unique(); + stream->runtime = runtime; + stream->owner = connection; + stream->handle = event->PEER_STREAM_STARTED.Stream; + stream->inbound = true; + stream->id = NextId(runtime); + Stream* raw = stream.get(); + { + std::lock_guard lock(runtime->gate); + runtime->streams.emplace(raw->id, std::move(stream)); + } + runtime->api->SetCallbackHandler( + event->PEER_STREAM_STARTED.Stream, reinterpret_cast(StreamCallback), raw); + break; + } + case QUIC_CONNECTION_EVENT_PEER_CERTIFICATE_RECEIVED: { + const auto* encoded = reinterpret_cast(event->PEER_CERTIFICATE_RECEIVED.Certificate); + AppendTrace(connection, "certificate-status=" + + Hex(static_cast(event->PEER_CERTIFICATE_RECEIVED.DeferredStatus))); +#if defined(_WIN32) + if (connection->has_pin) { + // The v1 contract: the pin decision is made here, in C, and the host + // is never asked. Only `cultmesh_quic_open` sets `has_pin`. + const bool matches = CertificateMatchesPin( + connection, event->PEER_CERTIFICATE_RECEIVED.Certificate); + if (!matches) + SetError(runtime, + "CultMesh QUIC provider certificate does not match the advertised SHA-256 pin."); + const auto completion = runtime->api->ConnectionCertificateValidationComplete( + handle, + matches ? static_cast(1) : static_cast(0), + matches ? QUIC_TLS_ALERT_CODE_SUCCESS : QUIC_TLS_ALERT_CODE_BAD_CERTIFICATE); + if (QUIC_FAILED(completion)) { + SetError(runtime, "CultMesh QUIC certificate validation completion failed (status=" + + Hex(static_cast(completion)) + ")."); + return completion; + } + return QUIC_STATUS_PENDING; + } +#endif + // v2: the DER goes to the host and the handshake waits. Nothing here + // decides trust. If the host never answers, MsQuic's handshake timeout + // closes the connection and event 4 reports it. + cultmesh_quic_event header{}; + header.type = kEventConnectionCertificateReceived; + header.listener_id = connection->listener_id; + header.connection_id = connection->id; + header.status = static_cast(event->PEER_CERTIFICATE_RECEIVED.DeferredStatus); + const uint8_t* der = (encoded != nullptr) ? encoded->Buffer : nullptr; + const size_t der_length = (encoded != nullptr) ? encoded->Length : 0; + Publish(runtime, header, der, der_length); + return QUIC_STATUS_PENDING; + } + case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_TRANSPORT: { + const std::string reason = "CultMesh QUIC connection was shut down by the transport (status=" + + Hex(static_cast(event->SHUTDOWN_INITIATED_BY_TRANSPORT.Status)) + ", error=" + + Hex(event->SHUTDOWN_INITIATED_BY_TRANSPORT.ErrorCode) + ")."; + cultmesh_quic_event header{}; + header.type = kEventConnectionShutdown; + header.listener_id = connection->listener_id; + header.connection_id = connection->id; + header.code = event->SHUTDOWN_INITIATED_BY_TRANSPORT.ErrorCode; + header.status = static_cast(event->SHUTDOWN_INITIATED_BY_TRANSPORT.Status); + Publish(runtime, header, reinterpret_cast(reason.data()), reason.size()); + break; + } + case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_PEER: { + const std::string reason = "CultMesh QUIC connection was shut down by the peer."; + cultmesh_quic_event header{}; + header.type = kEventConnectionShutdown; + header.listener_id = connection->listener_id; + header.connection_id = connection->id; + header.code = event->SHUTDOWN_INITIATED_BY_PEER.ErrorCode; + Publish(runtime, header, reinterpret_cast(reason.data()), reason.size()); + break; + } + case QUIC_CONNECTION_EVENT_SHUTDOWN_COMPLETE: { + const uint64_t connection_id = connection->id; + if (!event->SHUTDOWN_COMPLETE.AppCloseInProgress && !connection->handle_closed.exchange(true)) + runtime->api->ConnectionClose(handle); + DestroyConnection(runtime, connection_id); + break; + } + default: + break; + } + return QUIC_STATUS_SUCCESS; +} + +QUIC_STATUS QUIC_API ListenerCallback(HQUIC, void* context, QUIC_LISTENER_EVENT* event) { + auto* listener = static_cast(context); + Runtime* runtime = listener->runtime; + switch (event->Type) { + case QUIC_LISTENER_EVENT_NEW_CONNECTION: { + auto connection = std::make_unique(); + connection->runtime = runtime; + connection->handle = event->NEW_CONNECTION.Connection; + connection->inbound = true; + connection->listener_id = listener->id; + connection->id = NextId(runtime); + Connection* raw = connection.get(); + { + std::lock_guard lock(runtime->gate); + runtime->connections.emplace(raw->id, std::move(connection)); + } + runtime->api->SetCallbackHandler( + event->NEW_CONNECTION.Connection, reinterpret_cast(ConnectionCallback), raw); + const auto status = runtime->api->ConnectionSetConfiguration( + event->NEW_CONNECTION.Connection, listener->configuration); + if (QUIC_FAILED(status)) { + SetError(runtime, "CultMesh QUIC inbound connection configuration failed (status=" + + Hex(static_cast(status)) + ")."); + return status; + } + PublishSimple(runtime, kEventListenerNewConnection, listener->id, raw->id, 0, 0, 0); + break; + } + case QUIC_LISTENER_EVENT_STOP_COMPLETE: + PublishSimple(runtime, kEventListenerStopped, listener->id, 0, 0, 0, 0); + break; + default: + break; + } + return QUIC_STATUS_SUCCESS; +} + +void FillSettings(QUIC_SETTINGS& settings) { + settings.IdleTimeoutMs = kIdleTimeoutMs; + settings.IsSet.IdleTimeoutMs = 1; + settings.KeepAliveIntervalMs = kKeepAliveIntervalMs; + settings.IsSet.KeepAliveIntervalMs = 1; + settings.PeerUnidiStreamCount = kPeerUnidiStreamCount; + settings.IsSet.PeerUnidiStreamCount = 1; + settings.HandshakeIdleTimeoutMs = kHandshakeIdleTimeoutMs; + settings.IsSet.HandshakeIdleTimeoutMs = 1; +} + +QUIC_BUFFER AlpnBuffer() { + return QUIC_BUFFER{ + static_cast(sizeof(kAlpn) - 1), + reinterpret_cast(const_cast(kAlpn)) + }; +} + +// Opened once per runtime, on first outbound connection. +QUIC_STATUS EnsureClientConfiguration(Runtime* runtime) { + if (runtime->client_configuration != nullptr) return QUIC_STATUS_SUCCESS; + + QUIC_SETTINGS settings{}; + FillSettings(settings); + QUIC_BUFFER alpn = AlpnBuffer(); + HQUIC configuration = nullptr; + auto status = runtime->api->ConfigurationOpen( + runtime->registration, &alpn, 1, &settings, sizeof(settings), nullptr, &configuration); + if (QUIC_FAILED(status)) return status; + + QUIC_CREDENTIAL_CONFIG credentials{}; + credentials.Type = QUIC_CREDENTIAL_TYPE_NONE; + credentials.Flags = static_cast( + QUIC_CREDENTIAL_FLAG_CLIENT | + QUIC_CREDENTIAL_FLAG_INDICATE_CERTIFICATE_RECEIVED | + QUIC_CREDENTIAL_FLAG_DEFER_CERTIFICATE_VALIDATION | + QUIC_CREDENTIAL_FLAG_USE_PORTABLE_CERTIFICATES); + status = runtime->api->ConfigurationLoadCredential(configuration, &credentials); + if (QUIC_FAILED(status)) { + runtime->api->ConfigurationClose(configuration); + return status; + } + runtime->client_configuration = configuration; + return QUIC_STATUS_SUCCESS; +} + +// `pin` is the v1 shim's and nothing else passes it. It must be attached before +// `ConnectionStart`, not after it returns: the handshake runs on an MsQuic +// worker thread and reaches the certificate event immediately on loopback, so a +// pin applied afterwards loses the race, the connection takes the v2 path, and +// the handshake stalls waiting for an answer from a host that was never told to +// give one. +int32_t OpenConnection(Runtime* runtime, const char* host, uint16_t port, uint64_t* out_connection_id, + Connection** out_connection, const std::array* pin) { + if (runtime == nullptr || host == nullptr || *host == '\0' || port == 0 || out_connection_id == nullptr) + return -1; + *out_connection_id = 0; + + auto status = EnsureClientConfiguration(runtime); + if (QUIC_FAILED(status)) { + SetError(runtime, "CultMesh QUIC client configuration failed (status=" + + Hex(static_cast(status)) + ")."); + return static_cast(status); + } + + auto connection = std::make_unique(); + connection->runtime = runtime; + connection->id = NextId(runtime); + if (pin != nullptr) { + connection->has_pin = true; + connection->pin = *pin; + } + Connection* raw = connection.get(); + + status = runtime->api->ConnectionOpen(runtime->registration, ConnectionCallback, raw, &raw->handle); + if (QUIC_FAILED(status)) { + SetError(runtime, "CultMesh QUIC connection open failed (status=" + + Hex(static_cast(status)) + ")."); + return static_cast(status); + } + { + std::lock_guard lock(runtime->gate); + runtime->connections.emplace(raw->id, std::move(connection)); + } + + status = runtime->api->ConnectionStart( + raw->handle, runtime->client_configuration, QUIC_ADDRESS_FAMILY_UNSPEC, host, port); + if (QUIC_FAILED(status)) { + SetError(runtime, "CultMesh QUIC connection start failed (status=" + + Hex(static_cast(status)) + ")."); + runtime->api->ConnectionClose(raw->handle); + DestroyConnection(runtime, raw->id); + return static_cast(status); + } + + *out_connection_id = raw->id; + if (out_connection != nullptr) *out_connection = raw; + return 0; +} + +} // namespace + +// --------------------------------------------------------------------------- +// C ABI v2: the runtime-neutral bridge. +// --------------------------------------------------------------------------- + +CULTMESH_API int32_t cultmesh_quic_runtime_open(const char* app_name, void** out_runtime) { + if (out_runtime == nullptr) return -1; + *out_runtime = nullptr; + auto runtime = std::make_unique(); + + auto status = MsQuicOpenVersion(kApiVersion, reinterpret_cast(&runtime->api)); + if (QUIC_FAILED(status)) return static_cast(status); + + const QUIC_REGISTRATION_CONFIG registration_config = { + (app_name != nullptr && *app_name != '\0') ? app_name : "GameCult.Mesh.Quic.Native", + QUIC_EXECUTION_PROFILE_TYPE_REAL_TIME + }; + status = runtime->api->RegistrationOpen(®istration_config, &runtime->registration); + if (QUIC_FAILED(status)) { + MsQuicClose(runtime->api); + return static_cast(status); + } + + *out_runtime = runtime.release(); + return 0; +} + +CULTMESH_API void cultmesh_quic_runtime_close(void* handle) { + auto* runtime = static_cast(handle); + if (runtime == nullptr) return; + { + std::lock_guard lock(runtime->gate); + runtime->closing = true; + } + runtime->signal.notify_all(); + + // Bottom-up, and by the app's own hand. `RegistrationClose` blocks until + // every child handle the app opened has been closed *by the app*, and a + // silent shutdown delivers no shutdown events at all, so leaning on the + // callbacks to do the closing deadlocks the caller forever. Connections are + // closed here; MsQuic cascades that to their streams, which arrive at + // `StreamCallback` with `AppCloseInProgress` set. + // + // The handles are copied out from under the lock and closed without it: a + // callback running concurrently takes the same lock, and `ConnectionClose` + // does not return until those callbacks have finished. + std::vector connections; + std::vector listeners; + std::vector configurations; + { + std::lock_guard lock(runtime->gate); + for (auto& entry : runtime->connections) + if (entry.second->handle != nullptr && !entry.second->handle_closed.exchange(true)) + connections.push_back(entry.second->handle); + for (auto& entry : runtime->listeners) { + if (entry.second->handle != nullptr) listeners.push_back(entry.second->handle); + if (entry.second->configuration != nullptr) configurations.push_back(entry.second->configuration); + } + } + for (HQUIC connection : connections) { + runtime->api->ConnectionShutdown(connection, QUIC_CONNECTION_SHUTDOWN_FLAG_SILENT, kConnectionCloseCode); + runtime->api->ConnectionClose(connection); + } + for (HQUIC listener : listeners) runtime->api->ListenerClose(listener); + for (HQUIC configuration : configurations) runtime->api->ConfigurationClose(configuration); + if (runtime->client_configuration != nullptr) { + runtime->api->ConfigurationClose(runtime->client_configuration); + runtime->client_configuration = nullptr; + } + + // No callback can be running past this point, so the tracking maps are safe + // to drop. + if (runtime->registration != nullptr) { + runtime->api->RegistrationClose(runtime->registration); + runtime->registration = nullptr; + } + runtime->streams.clear(); + runtime->connections.clear(); + runtime->listeners.clear(); + if (runtime->api != nullptr) { + MsQuicClose(runtime->api); + runtime->api = nullptr; + } + delete runtime; +} + +CULTMESH_API int32_t cultmesh_quic_listener_open( + void* handle, const char* host, uint16_t port, + const uint8_t* pkcs12, int32_t pkcs12_len, const char* password, + uint64_t* out_listener_id, uint16_t* out_bound_port) { + auto* runtime = static_cast(handle); + if (runtime == nullptr || pkcs12 == nullptr || pkcs12_len <= 0 || out_listener_id == nullptr) + return -1; + *out_listener_id = 0; + if (out_bound_port != nullptr) *out_bound_port = 0; + + auto listener = std::make_unique(); + listener->runtime = runtime; + listener->id = NextId(runtime); + + QUIC_SETTINGS settings{}; + FillSettings(settings); + QUIC_BUFFER alpn = AlpnBuffer(); + auto status = runtime->api->ConfigurationOpen( + runtime->registration, &alpn, 1, &settings, sizeof(settings), nullptr, &listener->configuration); + if (QUIC_FAILED(status)) { + SetError(runtime, "CultMesh QUIC listener configuration failed (status=" + + Hex(static_cast(status)) + ")."); + return static_cast(status); + } + + // PKCS12 is the one credential type Schannel and OpenSSL both take, which + // is why the provider ships a PKCS12 rather than a platform store handle. + QUIC_CERTIFICATE_PKCS12 pkcs12_certificate{}; + pkcs12_certificate.Asn1Blob = pkcs12; + pkcs12_certificate.Asn1BlobLength = static_cast(pkcs12_len); + pkcs12_certificate.PrivateKeyPassword = (password != nullptr && *password != '\0') ? password : nullptr; + + QUIC_CREDENTIAL_CONFIG credentials{}; + credentials.Type = QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12; + credentials.CertificatePkcs12 = &pkcs12_certificate; + credentials.Flags = QUIC_CREDENTIAL_FLAG_NONE; + status = runtime->api->ConfigurationLoadCredential(listener->configuration, &credentials); + if (QUIC_FAILED(status)) { + SetError(runtime, "CultMesh QUIC listener certificate could not be loaded (status=" + + Hex(static_cast(status)) + ")."); + runtime->api->ConfigurationClose(listener->configuration); + return static_cast(status); + } + + Listener* raw = listener.get(); + status = runtime->api->ListenerOpen(runtime->registration, ListenerCallback, raw, &raw->handle); + if (QUIC_FAILED(status)) { + SetError(runtime, "CultMesh QUIC listener open failed (status=" + + Hex(static_cast(status)) + ")."); + runtime->api->ConfigurationClose(listener->configuration); + return static_cast(status); + } + { + std::lock_guard lock(runtime->gate); + runtime->listeners.emplace(raw->id, std::move(listener)); + } + + QUIC_ADDR address{}; + QuicAddrSetFamily(&address, QUIC_ADDRESS_FAMILY_UNSPEC); + QuicAddrSetPort(&address, port); + if (host != nullptr && *host != '\0' && !QuicAddrFromString(host, port, &address)) { + SetError(runtime, "CultMesh QUIC listener host is not an IP address."); + return -2; + } + + QUIC_BUFFER listener_alpn = AlpnBuffer(); + status = runtime->api->ListenerStart(raw->handle, &listener_alpn, 1, &address); + if (QUIC_FAILED(status)) { + SetError(runtime, "CultMesh QUIC listener start failed (status=" + + Hex(static_cast(status)) + ")."); + return static_cast(status); + } + + // Port 0 means "pick one"; the host needs the chosen port to advertise it. + QUIC_ADDR bound{}; + uint32_t bound_size = sizeof(bound); + status = runtime->api->GetParam(raw->handle, QUIC_PARAM_LISTENER_LOCAL_ADDRESS, &bound_size, &bound); + if (QUIC_FAILED(status)) { + SetError(runtime, "CultMesh QUIC listener address could not be read (status=" + + Hex(static_cast(status)) + ")."); + return static_cast(status); + } + if (out_bound_port != nullptr) *out_bound_port = QuicAddrGetPort(&bound); + *out_listener_id = raw->id; + return 0; +} + +CULTMESH_API void cultmesh_quic_listener_close(void* handle, uint64_t listener_id) { + auto* runtime = static_cast(handle); + if (runtime == nullptr) return; + Listener* listener = FindListener(runtime, listener_id); + if (listener == nullptr || listener->stopped) return; + listener->stopped = true; + if (listener->handle != nullptr) runtime->api->ListenerClose(listener->handle); + if (listener->configuration != nullptr) runtime->api->ConfigurationClose(listener->configuration); + std::lock_guard lock(runtime->gate); + runtime->listeners.erase(listener_id); +} + +CULTMESH_API int32_t cultmesh_quic_connection_open( + void* handle, const char* host, uint16_t port, uint64_t* out_connection_id) { + return OpenConnection(static_cast(handle), host, port, out_connection_id, nullptr, nullptr); +} + +CULTMESH_API int32_t cultmesh_quic_connection_certificate_complete( + void* handle, uint64_t connection_id, int32_t accept) { + auto* runtime = static_cast(handle); + if (runtime == nullptr) return -1; + Connection* connection = FindConnection(runtime, connection_id); + if (connection == nullptr) return -1; + const auto status = runtime->api->ConnectionCertificateValidationComplete( + connection->handle, + accept != 0 ? static_cast(1) : static_cast(0), + accept != 0 ? QUIC_TLS_ALERT_CODE_SUCCESS : QUIC_TLS_ALERT_CODE_BAD_CERTIFICATE); + if (QUIC_FAILED(status)) { + SetError(runtime, "CultMesh QUIC certificate validation completion failed (status=" + + Hex(static_cast(status)) + ")."); + return static_cast(status); + } + return 0; +} + +CULTMESH_API void cultmesh_quic_connection_shutdown(void* handle, uint64_t connection_id, uint64_t code) { + auto* runtime = static_cast(handle); + if (runtime == nullptr) return; + Connection* connection = FindConnection(runtime, connection_id); + if (connection == nullptr || connection->closing) return; + connection->closing = true; + if (connection->handle != nullptr) + runtime->api->ConnectionShutdown(connection->handle, QUIC_CONNECTION_SHUTDOWN_FLAG_NONE, code); +} + +CULTMESH_API int32_t cultmesh_quic_stream_open( + void* handle, uint64_t connection_id, uint8_t kind, uint64_t* out_stream_id) { + auto* runtime = static_cast(handle); + if (runtime == nullptr || out_stream_id == nullptr) return -1; + *out_stream_id = 0; + if (kind != kReliableStream && kind != kLatestOnlyStream) return -2; + Connection* connection = FindConnection(runtime, connection_id); + if (connection == nullptr) return -1; + + auto stream = std::make_unique(); + stream->runtime = runtime; + stream->owner = connection; + stream->kind = kind; + stream->has_kind = true; + stream->id = NextId(runtime); + Stream* raw = stream.get(); + + auto status = runtime->api->StreamOpen( + connection->handle, QUIC_STREAM_OPEN_FLAG_UNIDIRECTIONAL, + StreamCallback, raw, &raw->handle); + if (QUIC_FAILED(status)) { + SetError(runtime, "CultMesh QUIC stream open failed (status=" + + Hex(static_cast(status)) + ")."); + return static_cast(status); + } + status = runtime->api->StreamStart(raw->handle, QUIC_STREAM_START_FLAG_IMMEDIATE); + if (QUIC_FAILED(status)) { + SetError(runtime, "CultMesh QUIC stream start failed (status=" + + Hex(static_cast(status)) + ")."); + runtime->api->StreamClose(raw->handle); + return static_cast(status); + } + { + std::lock_guard lock(runtime->gate); + runtime->streams.emplace(raw->id, std::move(stream)); + } + + // The kind byte is the first thing on the stream, which is what the peer's + // reassembly reads before any length prefix. + auto* request = new SendRequest(); + request->bytes.assign(1, kind); + request->buffer.Buffer = request->bytes.data(); + request->buffer.Length = 1; + status = runtime->api->StreamSend(raw->handle, &request->buffer, 1, QUIC_SEND_FLAG_NONE, request); + if (QUIC_FAILED(status)) { + delete request; + SetError(runtime, "CultMesh QUIC stream kind could not be sent (status=" + + Hex(static_cast(status)) + ")."); + return static_cast(status); + } + + *out_stream_id = raw->id; + return 0; +} + +CULTMESH_API int32_t cultmesh_quic_stream_send_frame( + void* handle, uint64_t stream_id, const uint8_t* encoded_frame, int32_t length, int32_t fin) { + auto* runtime = static_cast(handle); + if (runtime == nullptr || encoded_frame == nullptr || length <= 0) return -1; + if (static_cast(length) > kMaximumEncodedFrameBytes) return -2; + Stream* stream = FindStream(runtime, stream_id); + if (stream == nullptr || stream->handle == nullptr) return -1; + + // The bytes are copied because MsQuic reads them after this returns; the + // 4-byte LE length prefix is the QUIC stream framing, and it is added here + // so that framing lives in one place for both directions. + auto* request = new SendRequest(); + request->bytes.resize(sizeof(uint32_t) + static_cast(length)); + WriteUInt32LittleEndian(request->bytes.data(), static_cast(length)); + std::memcpy(request->bytes.data() + sizeof(uint32_t), encoded_frame, static_cast(length)); + request->buffer.Buffer = request->bytes.data(); + request->buffer.Length = static_cast(request->bytes.size()); + + const auto flags = (fin != 0) ? QUIC_SEND_FLAG_FIN : QUIC_SEND_FLAG_NONE; + const auto status = runtime->api->StreamSend(stream->handle, &request->buffer, 1, flags, request); + if (QUIC_FAILED(status)) { + delete request; + SetError(runtime, "CultMesh QUIC frame send failed (status=" + + Hex(static_cast(status)) + ")."); + return static_cast(status); + } + return 0; +} + +CULTMESH_API void cultmesh_quic_stream_shutdown(void* handle, uint64_t stream_id, uint64_t code) { + auto* runtime = static_cast(handle); + if (runtime == nullptr) return; + Stream* stream = FindStream(runtime, stream_id); + if (stream == nullptr || stream->handle == nullptr) return; + runtime->api->StreamShutdown(stream->handle, QUIC_STREAM_SHUTDOWN_FLAG_ABORT, code); +} + +// The one blocking crossing. Returns 0 on timeout, 1 with the event filled and +// its payload copied, 2 when `payload_capacity` is too small (the event stays at +// the head of the queue and `out_required` is set), negative on a bad call. This +// is the v1 two-phase poll convention applied to a queue of typed events. +CULTMESH_API int32_t cultmesh_quic_next_event( + void* handle, int32_t timeout_ms, cultmesh_quic_event* out_event, + uint8_t* payload, int32_t payload_capacity, int32_t* out_required) { + auto* runtime = static_cast(handle); + if (runtime == nullptr || out_event == nullptr || out_required == nullptr || payload_capacity < 0) + return -1; + *out_required = 0; + + std::unique_lock lock(runtime->gate); + if (runtime->events.empty() && timeout_ms > 0) { + runtime->signal.wait_for(lock, std::chrono::milliseconds(timeout_ms), + [runtime] { return !runtime->events.empty() || runtime->closing; }); + } + if (runtime->events.empty()) return 0; + + const QueuedEvent& queued = runtime->events.front(); + const auto required = static_cast(queued.payload.size()); + if (required > payload_capacity) { + *out_required = required; + return 2; + } + *out_event = queued.header; + if (required > 0 && payload != nullptr) + std::memcpy(payload, queued.payload.data(), static_cast(required)); + *out_required = required; + runtime->events.pop_front(); + return 1; +} + +CULTMESH_API int32_t cultmesh_quic_last_error(void* handle, char* destination, int32_t capacity) { + auto* runtime = static_cast(handle); + if (runtime == nullptr || destination == nullptr || capacity <= 0) return -1; + std::lock_guard lock(runtime->gate); + const size_t count = (std::min)(runtime->error.size(), static_cast(capacity - 1)); + std::memcpy(destination, runtime->error.data(), count); + destination[count] = '\0'; + return static_cast(count); +} + +// --------------------------------------------------------------------------- +// C ABI v1: the Unity shim. Windows only, by the same construction as its only +// caller (`CultMeshNativeQuicRealtimeTransport.CanConnect` is Windows-gated). +// +// These five exports are the contract the shipped Unity package imports by +// name. They are preserved byte for byte in signature and behaviour, and they +// decide nothing the v2 path does not: a v1 client is a private runtime with one +// connection. The single exception is the pin, which v1 compares here in C +// because that is what the managed connector was built against. +// --------------------------------------------------------------------------- + +#if defined(_WIN32) + +#include +#include +#include + +namespace { + enum class ClientState : int32_t { Connecting = 0, Connected = 1, @@ -38,50 +973,34 @@ enum class ClientState : int32_t { Closed = 3, }; -struct Client; - -struct StreamContext { - explicit StreamContext(Client* client) : owner(client) {} - Client* owner; - std::vector buffered; - uint8_t kind = 0; - bool has_kind = false; -}; - -struct Client { - const QUIC_API_TABLE* api = nullptr; - HQUIC registration = nullptr; - HQUIC configuration = nullptr; - HQUIC connection = nullptr; - std::array certificate_pin{}; - std::atomic state{ClientState::Connecting}; - std::atomic closing{false}; - std::mutex gate; - std::deque> received; +struct V1Client { + Runtime* runtime = nullptr; + Connection* connection = nullptr; + uint64_t connection_id = 0; + ClientState state = ClientState::Connecting; + std::deque> frames; std::string error; - std::string trace; + bool closing = false; + // The managed connector polls `state` and `poll` from its own loop and may + // read `error` from the caller's thread, so the drain and everything it + // mutates sit behind one lock. Held only around `Pump` and the fields; it is + // always taken before the runtime's, never after. + std::mutex gate; }; -void AppendTrace(Client* client, const std::string& event) { - if (client == nullptr || client->state.load() == ClientState::Connected) return; - std::lock_guard lock(client->gate); - if (!client->trace.empty()) client->trace += ","; - client->trace += event; -} - -std::string TraceSnapshot(Client* client) { - if (client == nullptr) return "none"; - std::lock_guard lock(client->gate); - return client->trace.empty() ? "none" : client->trace; -} - -void SetFailure(Client* client, const std::string& message) { - if (client == nullptr || client->closing.load()) return; - { - std::lock_guard lock(client->gate); - if (client->error.empty()) client->error = message; - } - client->state.store(ClientState::Failed); +std::string LoadedMsQuicPath() { + const auto module = GetModuleHandleW(L"msquic.dll"); + if (module == nullptr) return "unresolved"; + std::array path{}; + const auto length = GetModuleFileNameW(module, path.data(), static_cast(path.size())); + if (length == 0 || length >= path.size()) return "unresolved"; + const auto required = WideCharToMultiByte( + CP_UTF8, 0, path.data(), static_cast(length), nullptr, 0, nullptr, nullptr); + if (required <= 0) return "unresolved"; + std::string utf8(static_cast(required), '\0'); + WideCharToMultiByte( + CP_UTF8, 0, path.data(), static_cast(length), utf8.data(), required, nullptr, nullptr); + return utf8; } bool ParseHexNibble(char value, uint8_t& nibble) { @@ -104,337 +1023,146 @@ bool ParsePin(const char* value, std::array& pin) { return true; } -uint32_t ReadUInt32LittleEndian(const uint8_t* value) { - return static_cast(value[0]) | - (static_cast(value[1]) << 8) | - (static_cast(value[2]) << 16) | - (static_cast(value[3]) << 24); -} +// Drains the runtime's event queue into the v1 client's own shape: frames for +// `poll`, a state for `state`, an error string for `error`. This is where the +// v1 contract is reconstructed from v2 events, and the only place it is. +void Pump(V1Client* client) { + cultmesh_quic_event header{}; + std::vector payload; + for (;;) { + int32_t required = 0; + auto result = cultmesh_quic_next_event( + client->runtime, 0, &header, + payload.empty() ? nullptr : payload.data(), + static_cast(payload.size()), &required); + if (result == 2) { + payload.resize(static_cast(required)); + continue; + } + if (result != 1) break; -void FailStream(StreamContext* stream, const char* message) { - SetFailure(stream->owner, message); - if (stream->owner != nullptr && stream->owner->api != nullptr && stream->owner->connection != nullptr) - stream->owner->api->ConnectionShutdown( - stream->owner->connection, - QUIC_CONNECTION_SHUTDOWN_FLAG_SILENT, - kStreamAbortCode); -} - -bool ConsumeFrames(StreamContext* stream) { - auto& bytes = stream->buffered; - if (!stream->has_kind) { - if (bytes.empty()) return true; - stream->kind = bytes.front(); - bytes.erase(bytes.begin()); - stream->has_kind = true; - if (stream->kind != kReliableStream && stream->kind != kLatestOnlyStream) { - FailStream(stream, "CultMesh QUIC stream kind is invalid."); - return false; + switch (header.type) { + case kEventConnectionConnected: + if (client->state == ClientState::Connecting) client->state = ClientState::Connected; + break; + case kEventStreamFrame: + client->frames.emplace_back(payload.begin(), payload.begin() + header.payload_length); + break; + case kEventConnectionShutdown: + if (client->closing) { + client->state = ClientState::Closed; + } else if (client->state != ClientState::Failed) { + client->state = ClientState::Failed; + if (client->error.empty()) { + char runtime_error[1024]{}; + cultmesh_quic_last_error(client->runtime, runtime_error, sizeof(runtime_error)); + // The pin refusal is the runtime's, and the managed + // connector matches on its wording; anything else is the + // transport's own reason plus where msquic came from. + client->error = runtime_error[0] != '\0' + ? std::string(runtime_error) + : std::string(reinterpret_cast(payload.data()), + static_cast(header.payload_length)); + client->error += " (msquic=" + LoadedMsQuicPath() + ")"; + } + } + break; + default: + break; } } - - while (bytes.size() >= sizeof(uint32_t)) { - const uint32_t length = ReadUInt32LittleEndian(bytes.data()); - if (length == 0 || length > kMaximumEncodedFrameBytes) { - FailStream(stream, "CultMesh QUIC frame length is invalid."); - return false; - } - const size_t framed_length = sizeof(uint32_t) + static_cast(length); - if (bytes.size() < framed_length) return true; - std::vector frame(length); - std::memcpy(frame.data(), bytes.data() + sizeof(uint32_t), length); - { - std::lock_guard lock(stream->owner->gate); - stream->owner->received.emplace_back(std::move(frame)); - } - bytes.erase(bytes.begin(), bytes.begin() + static_cast(framed_length)); - if (stream->kind == kLatestOnlyStream && !bytes.empty()) { - FailStream(stream, "CultMesh latest-only QUIC stream carried multiple frames."); - return false; - } - } - return true; } -QUIC_STATUS QUIC_API StreamCallback(HQUIC stream_handle, void* context, QUIC_STREAM_EVENT* event) { - auto* stream = static_cast(context); - switch (event->Type) { - case QUIC_STREAM_EVENT_RECEIVE: - for (uint32_t index = 0; index < event->RECEIVE.BufferCount; ++index) { - const auto& buffer = event->RECEIVE.Buffers[index]; - stream->buffered.insert(stream->buffered.end(), buffer.Buffer, buffer.Buffer + buffer.Length); - } - ConsumeFrames(stream); - break; - case QUIC_STREAM_EVENT_PEER_SEND_SHUTDOWN: - if (!stream->buffered.empty()) - FailStream(stream, "CultMesh QUIC stream ended with a truncated frame."); - break; - case QUIC_STREAM_EVENT_SHUTDOWN_COMPLETE: - if (!event->SHUTDOWN_COMPLETE.AppCloseInProgress) - stream->owner->api->StreamClose(stream_handle); - delete stream; - break; - default: - break; - } - return QUIC_STATUS_SUCCESS; -} - -bool CertificateMatchesPin(Client* client, QUIC_CERTIFICATE* certificate) { +bool CertificateMatchesPin(Connection* connection, QUIC_CERTIFICATE* certificate) { if (certificate == nullptr) return false; const auto* encoded = reinterpret_cast(certificate); if (encoded->Buffer == nullptr || encoded->Length == 0) return false; BYTE digest[32]{}; DWORD digest_length = sizeof(digest); if (!CryptHashCertificate2( - BCRYPT_SHA256_ALGORITHM, - 0, - nullptr, - encoded->Buffer, - encoded->Length, - digest, - &digest_length) || digest_length != sizeof(digest)) + BCRYPT_SHA256_ALGORITHM, 0, nullptr, + encoded->Buffer, encoded->Length, digest, &digest_length) || + digest_length != sizeof(digest)) return false; - return std::memcmp(digest, client->certificate_pin.data(), sizeof(digest)) == 0; -} - -std::string Hex(uint64_t value) { - std::ostringstream text; - text << "0x" << std::hex << std::uppercase << value; - return text.str(); -} - -std::string LoadedMsQuicPath() { - const auto module = GetModuleHandleW(L"msquic.dll"); - if (module == nullptr) return "unresolved"; - std::array path{}; - const auto length = GetModuleFileNameW(module, path.data(), static_cast(path.size())); - if (length == 0 || length >= path.size()) return "unresolved"; - const auto required = WideCharToMultiByte( - CP_UTF8, 0, path.data(), static_cast(length), nullptr, 0, nullptr, nullptr); - if (required <= 0) return "unresolved"; - std::string utf8(static_cast(required), '\0'); - WideCharToMultiByte( - CP_UTF8, 0, path.data(), static_cast(length), utf8.data(), required, nullptr, nullptr); - return utf8; -} - -QUIC_STATUS QUIC_API ConnectionCallback(HQUIC connection, void* context, QUIC_CONNECTION_EVENT* event) { - auto* client = static_cast(context); - AppendTrace(client, "event=" + std::to_string(static_cast(event->Type))); - switch (event->Type) { - case QUIC_CONNECTION_EVENT_CONNECTED: - client->state.store(ClientState::Connected); - break; - case QUIC_CONNECTION_EVENT_PEER_STREAM_STARTED: { - auto* stream = new (std::nothrow) StreamContext(client); - if (stream == nullptr) return QUIC_STATUS_OUT_OF_MEMORY; - client->api->SetCallbackHandler( - event->PEER_STREAM_STARTED.Stream, - reinterpret_cast(StreamCallback), - stream); - break; - } - case QUIC_CONNECTION_EVENT_PEER_CERTIFICATE_RECEIVED: - { - AppendTrace( - client, - "certificate-status=" + - Hex(static_cast(event->PEER_CERTIFICATE_RECEIVED.DeferredStatus))); - const auto matches = CertificateMatchesPin( - client, - event->PEER_CERTIFICATE_RECEIVED.Certificate); - if (!matches) { - SetFailure(client, "CultMesh QUIC provider certificate does not match the advertised SHA-256 pin."); - } - const auto completion = client->api->ConnectionCertificateValidationComplete( - connection, - matches ? TRUE : FALSE, - matches ? QUIC_TLS_ALERT_CODE_SUCCESS : QUIC_TLS_ALERT_CODE_BAD_CERTIFICATE); - if (QUIC_FAILED(completion)) { - SetFailure( - client, - "CultMesh QUIC certificate validation completion failed (status=" + - Hex(static_cast(completion)) + ")."); - return completion; - } - return QUIC_STATUS_PENDING; - } - case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_TRANSPORT: - if (!client->closing.load()) { - SetFailure( - client, - "CultMesh QUIC connection was shut down by the transport " - "(status=" + Hex(static_cast(event->SHUTDOWN_INITIATED_BY_TRANSPORT.Status)) + - ", error=" + Hex(event->SHUTDOWN_INITIATED_BY_TRANSPORT.ErrorCode) + - ", msquic=" + LoadedMsQuicPath() + - ", events=" + TraceSnapshot(client) + ")."); - } - break; - case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_PEER: - if (!client->closing.load()) - SetFailure(client, "CultMesh QUIC connection was shut down by the provider."); - break; - case QUIC_CONNECTION_EVENT_SHUTDOWN_COMPLETE: - if (client->closing.load()) client->state.store(ClientState::Closed); - break; - default: - break; - } - return QUIC_STATUS_SUCCESS; -} - -void CloseHandles(Client* client) { - if (client->connection != nullptr) { - client->api->ConnectionClose(client->connection); - client->connection = nullptr; - } - if (client->configuration != nullptr) { - client->api->ConfigurationClose(client->configuration); - client->configuration = nullptr; - } - if (client->registration != nullptr) { - client->api->RegistrationClose(client->registration); - client->registration = nullptr; - } - if (client->api != nullptr) { - MsQuicClose(client->api); - client->api = nullptr; - } + return std::memcmp(digest, connection->pin.data(), sizeof(digest)) == 0; } } // namespace CULTMESH_API int32_t cultmesh_quic_open( - const char* host, - uint16_t port, - const char* certificate_sha256, - Client** result) { + const char* host, uint16_t port, const char* certificate_sha256, V1Client** result) { if (host == nullptr || *host == '\0' || port == 0 || result == nullptr) return -1; *result = nullptr; - auto client = std::make_unique(); - if (!ParsePin(certificate_sha256, client->certificate_pin)) return -2; - QUIC_STATUS status = MsQuicOpenVersion( - kApiVersion, - reinterpret_cast(&client->api)); - if (QUIC_FAILED(status)) return status; + std::array pin{}; + if (!ParsePin(certificate_sha256, pin)) return -2; - const QUIC_REGISTRATION_CONFIG registration_config = { - "GameCult.Mesh.Quic.Native", - QUIC_EXECUTION_PROFILE_TYPE_REAL_TIME - }; - status = client->api->RegistrationOpen(®istration_config, &client->registration); - if (QUIC_FAILED(status)) { - CloseHandles(client.get()); - return status; - } - - QUIC_SETTINGS settings{}; - settings.IdleTimeoutMs = 30000; - settings.IsSet.IdleTimeoutMs = TRUE; - settings.KeepAliveIntervalMs = 5000; - settings.IsSet.KeepAliveIntervalMs = TRUE; - settings.PeerUnidiStreamCount = 1024; - settings.IsSet.PeerUnidiStreamCount = TRUE; - const QUIC_BUFFER alpn = { - static_cast(sizeof(kAlpn) - 1), - reinterpret_cast(const_cast(kAlpn)) - }; - status = client->api->ConfigurationOpen( - client->registration, - &alpn, - 1, - &settings, - sizeof(settings), - nullptr, - &client->configuration); - if (QUIC_FAILED(status)) { - CloseHandles(client.get()); - return status; - } - - QUIC_CREDENTIAL_CONFIG credentials{}; - credentials.Type = QUIC_CREDENTIAL_TYPE_NONE; - credentials.Flags = static_cast( - QUIC_CREDENTIAL_FLAG_CLIENT | - QUIC_CREDENTIAL_FLAG_INDICATE_CERTIFICATE_RECEIVED | - QUIC_CREDENTIAL_FLAG_DEFER_CERTIFICATE_VALIDATION | - QUIC_CREDENTIAL_FLAG_USE_PORTABLE_CERTIFICATES); - status = client->api->ConfigurationLoadCredential(client->configuration, &credentials); - if (QUIC_FAILED(status)) { - CloseHandles(client.get()); - return status; - } - - status = client->api->ConnectionOpen( - client->registration, - ConnectionCallback, - client.get(), - &client->connection); - if (QUIC_FAILED(status)) { - CloseHandles(client.get()); - return status; - } - status = client->api->ConnectionStart( - client->connection, - client->configuration, - QUIC_ADDRESS_FAMILY_UNSPEC, - host, - port); - if (QUIC_FAILED(status)) { - CloseHandles(client.get()); + auto client = std::make_unique(); + void* runtime_handle = nullptr; + const auto opened = cultmesh_quic_runtime_open("GameCult.Mesh.Quic.Native", &runtime_handle); + if (opened != 0) return opened; + client->runtime = static_cast(runtime_handle); + + // The pin goes in before the connection starts; see OpenConnection. + Connection* connection = nullptr; + const auto status = OpenConnection(client->runtime, host, port, &client->connection_id, &connection, &pin); + if (status != 0) { + cultmesh_quic_runtime_close(client->runtime); return status; } + client->connection = connection; *result = client.release(); return 0; } -CULTMESH_API int32_t cultmesh_quic_state(Client* client) { +CULTMESH_API int32_t cultmesh_quic_state(V1Client* client) { if (client == nullptr) return static_cast(ClientState::Failed); - return static_cast(client->state.load()); + std::lock_guard lock(client->gate); + Pump(client); + return static_cast(client->state); } CULTMESH_API int32_t cultmesh_quic_poll( - Client* client, - uint8_t* destination, - int32_t destination_length, - int32_t* required_length) { + V1Client* client, uint8_t* destination, int32_t destination_length, int32_t* required_length) { if (client == nullptr || required_length == nullptr || destination_length < 0) return -1; std::lock_guard lock(client->gate); - if (client->received.empty()) { + Pump(client); + if (client->frames.empty()) { *required_length = 0; - return client->state.load() == ClientState::Failed ? -2 : 0; + return client->state == ClientState::Failed ? -2 : 0; } - const auto& frame = client->received.front(); + const auto& frame = client->frames.front(); if (frame.size() > static_cast(INT32_MAX)) return -3; *required_length = static_cast(frame.size()); if (destination == nullptr || destination_length < *required_length) return 2; std::memcpy(destination, frame.data(), frame.size()); - client->received.pop_front(); + client->frames.pop_front(); return 1; } -CULTMESH_API int32_t cultmesh_quic_error( - Client* client, - char* destination, - int32_t destination_length) { +CULTMESH_API int32_t cultmesh_quic_error(V1Client* client, char* destination, int32_t destination_length) { if (client == nullptr || destination == nullptr || destination_length <= 0) return -1; std::lock_guard lock(client->gate); + Pump(client); const size_t count = (std::min)(client->error.size(), static_cast(destination_length - 1)); std::memcpy(destination, client->error.data(), count); destination[count] = '\0'; return static_cast(count); } -CULTMESH_API void cultmesh_quic_close(Client* client) { +CULTMESH_API void cultmesh_quic_close(V1Client* client) { if (client == nullptr) return; - client->closing.store(true); - if (client->connection != nullptr && client->api != nullptr) - client->api->ConnectionShutdown(client->connection, QUIC_CONNECTION_SHUTDOWN_FLAG_SILENT, kConnectionCloseCode); - CloseHandles(client); - client->state.store(ClientState::Closed); + { + std::lock_guard lock(client->gate); + client->closing = true; + } + // `runtime_close` already shuts the connection down silently with the same + // CULT close code and then closes the handle, which is what v1 did before + // it delegated. Shutting it down here as well would only race that. + cultmesh_quic_runtime_close(client->runtime); + client->state = ClientState::Closed; delete client; } + +#endif // _WIN32 From 23dc0939e0e4a528d475d20c6af8b9cd245edb8f Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 21:04:14 +0200 Subject: [PATCH 57/94] Give the bridge a Linux build the deploy host's own distribution can produce MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There is no Linux MsQuic binary in any NuGet package, and the v2.5.9 GitHub release carries only test bundles, so the Windows script's approach does not transfer. What does exist is Microsoft's Debian 13 pool, which is the same distribution Yggdrasil runs, and the msquic source tree at the matching tag for the POSIX headers the NuGet omits. `scripts/build-quic-native.sh` fetches the pinned `libmsquic_2.5.9_amd64.deb` and the three headers `msquic.h`, `msquic_posix.h` and `quic_sal_stub.h`, and verifies all four by SHA-256 the same way `build-quic-native.ps1:14` verifies the NuGet. A digest that stops matching is a changed dependency, not a warning. Two details the deb forced. It carries three library files and no licence text, so the MIT licence is copied from the one this repo already committed for the Windows plugin — the same text for both platforms. And it ships only `libmsquic.so.2.5.9`, with no `libmsquic.so` for `-lmsquic` to resolve against, so the script makes that link in the extracted tree rather than in the image. The Linux CMake branch links `-fvisibility=hidden`, so only the twelve v2 exports leave the `.so` and the Windows-only v1 five are absent by construction rather than by discipline, and sets `RPATH $ORIGIN` so the `libmsquic.so.2` shipped beside the bridge resolves without being installed system-wide. `build-quic-native.ps1`'s default output directory becomes `artifacts/quic-native/win32-x64` so the two platforms' outputs sit beside each other instead of on top of each other. Both existing callers — `build-unity-package.ps1:80-82` and the Native.Tests csproj `:20-22` — pass an explicit `-OutputDirectory`, so neither is affected. Built and smoked in the workstation's Docker `debian:13` engine pinned by digest: g++ 14.2.0, glibc 2.41, `libgamecult_mesh_quic_native.so` 85,456 bytes with `NEEDED libmsquic.so.2` and `RUNPATH $ORIGIN`, and the same 15-check v2 FFI smoke that runs on Windows passes under Node 24 on that image. That is a Linux build on a Linux host and nothing more: Q6 ruled the release artifact comes from the Actions job, and this one is the development loop. A Linux host still needs MsQuic's own runtime dependencies present — libssl3t64, libnuma1, libxdp1, libnl-route-3-200 — which is now written down, because the first smoke run failed on a missing libxdp.so.1 and the reason was not obvious from the error. Co-Authored-By: Claude Fable 5.1 --- native/GameCult.Mesh.Quic.Native/README.md | 94 ++++++++++++++++-- scripts/build-quic-native.ps1 | 5 +- scripts/build-quic-native.sh | 109 +++++++++++++++++++++ 3 files changed, 200 insertions(+), 8 deletions(-) create mode 100755 scripts/build-quic-native.sh diff --git a/native/GameCult.Mesh.Quic.Native/README.md b/native/GameCult.Mesh.Quic.Native/README.md index 875ebb3b..b2a2ba23 100644 --- a/native/GameCult.Mesh.Quic.Native/README.md +++ b/native/GameCult.Mesh.Quic.Native/README.md @@ -1,10 +1,90 @@ # GameCult.Mesh.Quic.Native -This Windows desktop bridge keeps MsQuic's callback-heavy C API below the -managed runtime boundary. It accepts a discovery-authorized SHA-256 certificate -pin, negotiates `cultmesh-state-v1`, and emits complete CultMesh realtime frame -payloads. It owns transport only; frame meaning remains in `GameCult.Mesh`. +One MsQuic body for every CultMesh host that is not .NET: two roles (provider +and consumer), two platforms (Windows x64 and Linux x64), and no callbacks +across the host boundary. -The build consumes Microsoft's pinned -`Microsoft.Native.Quic.MsQuic.Schannel` package. It does not contain -Aetheria-specific code. +The bridge owns MsQuic registration, configuration, listener, connection and +stream handles, TLS credential loading, the `cultmesh-state-v1` ALPN, the +1-byte-kind plus 4-byte-LE-length QUIC stream framing, and one event queue per +runtime. It owns transport and nothing else: it never decodes a CultMesh frame, +never decides delivery semantics, never coalesces, never reconnects, and in the +v2 path never decides whether to trust a certificate. Frame meaning stays in +`GameCult.Mesh` and in the TypeScript codec; trust stays with the host. + +## No host callbacks + +Every crossing is the host calling in, including the one blocking wait. MsQuic's +worker threads only ever push onto the queue and wake that wait, so no host +runtime is called from a thread it does not own. That is what lets one binary +serve a Node process through FFI and a Unity player through P/Invoke without +either one's threading rules leaking into the other. + +It is also why nothing here includes a Node header, a Unity header, or a +JavaScript engine: the bridge does not know what is on the other side. + +## Two ABIs + +**v2** is the runtime-neutral queue API, and the one new hosts should use: + + cultmesh_quic_runtime_open / runtime_close + cultmesh_quic_listener_open / listener_close + cultmesh_quic_connection_open / connection_certificate_complete / connection_shutdown + cultmesh_quic_stream_open / stream_send_frame / stream_shutdown + cultmesh_quic_next_event + cultmesh_quic_last_error + +`cultmesh_quic_event` is a fixed 64-byte struct described by layout rather than +by a shared header, so a host declares it in its own FFI. Its `type` is one of: +1 `listener_new_connection`, 2 `connection_connected`, 3 +`connection_certificate_received` (payload: the DER certificate), 4 +`connection_shutdown` (payload: a UTF-8 reason), 5 `stream_started` +(`stream_kind` taken from the stream's first byte), 6 `stream_frame` (payload: +one whole encoded frame, length prefix stripped), 7 `stream_send_complete`, 8 +`stream_shutdown`, 9 `listener_stopped`. + +`cultmesh_quic_next_event` returns 0 on timeout, 1 with the event filled and its +payload copied, 2 when the payload buffer is too small — the event stays at the +head of the queue and `out_required` is set, so the host can allocate and ask +again — and negative on a bad call. + +A client connection defers certificate validation: the bridge indicates the +certificate, emits event 3 carrying the DER, and answers MsQuic only when the +host calls `cultmesh_quic_connection_certificate_complete`. If the host never +answers, MsQuic's 10-second handshake timeout closes the connection and event 4 +reports it. Providers load their certificate as PKCS12; the advertised +`cert-sha256` pin is computed by the host from that same PKCS12, not here. + +**v1** is the five exports the shipped Unity package imports by name +(`cultmesh_quic_open`, `_state`, `_poll`, `_error`, `_close`). They are Windows +only, matching `CultMeshNativeQuicRealtimeTransport.CanConnect`, and are +implemented on top of a private v2 runtime holding one connection. They decide +nothing the v2 path does not, with one exception: a v1 connection carries a +SHA-256 pin that is compared here, in C, because that is the contract the +managed connector was built against. A v2 connection never carries one. + +## Building + +Windows x64, from the repo root: + + powershell -File scripts/build-quic-native.ps1 + +MsQuic comes from a pinned NuGet package verified by SHA-256, and the build uses +MSVC with `/Brepro` so a rebuild reproduces the committed Unity plugin DLL. + +Linux x64, on a Debian 13 host: + + scripts/build-quic-native.sh + +MsQuic comes from Microsoft's Debian 13 pool as a pinned `.deb`, and the POSIX +headers from the msquic source tree at the matching tag; all four downloads are +verified by SHA-256. The bridge is linked with `-fvisibility=hidden` so only the +v2 exports leave the `.so`, and with `RPATH $ORIGIN` so the `libmsquic.so.2` +shipped beside it resolves without being installed system-wide. + +A Linux host still needs MsQuic's own runtime dependencies present: +`libssl3t64`, `libnuma1`, `libxdp1`, `libnl-route-3-200`. + +Where an artifact was built is part of what it is. The Linux binary is linked +against Debian 13's glibc, so a build from anywhere else is a different artifact +whatever the file name says. diff --git a/scripts/build-quic-native.ps1 b/scripts/build-quic-native.ps1 index 68496180..f1b35787 100644 --- a/scripts/build-quic-native.ps1 +++ b/scripts/build-quic-native.ps1 @@ -1,7 +1,10 @@ param( [string] $Configuration = "Release", [string] $Architecture = "x64", - [string] $OutputDirectory = "artifacts\quic-native" + # Per-platform, so the Linux script's output sits beside this one's rather + # than on top of it. build-unity-package.ps1 and the Native.Tests csproj both + # pass an explicit -OutputDirectory, so neither is affected by this moving. + [string] $OutputDirectory = "artifacts\quic-native\win32-x64" ) $ErrorActionPreference = "Stop" diff --git a/scripts/build-quic-native.sh b/scripts/build-quic-native.sh new file mode 100755 index 00000000..1864caf3 --- /dev/null +++ b/scripts/build-quic-native.sh @@ -0,0 +1,109 @@ +#!/usr/bin/env bash +# Builds the CultMesh native QUIC bridge for Linux x64. +# +# The Windows counterpart (build-quic-native.ps1) takes MsQuic from a pinned +# NuGet package. There is no Linux binary in any MsQuic NuGet and the GitHub +# releases for v2.5.9 carry only test bundles, so the runtime here comes from +# Microsoft's Debian 13 pool and the headers come from the msquic source tree at +# the matching tag. Both are pinned by SHA-256 the same way the NuGet is: a +# digest that stops matching is a changed dependency, not a warning. +# +# This must run on a Debian 13 host (the container in .github/workflows, or the +# workstation's Docker engine for the development loop). The artifact is linked +# against that distribution's glibc, so where it was built is part of what it is. +# +# scripts/build-quic-native.sh [output-directory] +# +# Default output: artifacts/quic-native/linux-x64, which is git-ignored build +# output and never delivery. + +set -euo pipefail + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +version="2.5.9" +output_directory="${1:-${repo_root}/artifacts/quic-native/linux-x64}" +case "${output_directory}" in + /*) ;; + *) output_directory="${repo_root}/${output_directory}" ;; +esac + +cache_root="${repo_root}/artifacts/dependencies/msquic-linux-${version}" +deb_path="${cache_root}/libmsquic_${version}_amd64.deb" +extract_root="${cache_root}/package" +include_root="${cache_root}/include" +build_root="${repo_root}/artifacts/quic-native-build/linux-x64/Release" + +deb_url="https://packages.microsoft.com/debian/13/prod/pool/main/libm/libmsquic/libmsquic_${version}_amd64.deb" +deb_sha256="1baa61ade0b7b4a99f6dcb6b00d9aedb12b5566d00918a325be7425e878e51ba" +header_base="https://raw.githubusercontent.com/microsoft/msquic/v${version}/src/inc" + +# The three headers the POSIX build needs. msquic.h includes msquic_posix.h, +# which includes quic_sal_stub.h; the NuGet ships only the Windows trio. +header_names=("msquic.h" "msquic_posix.h" "quic_sal_stub.h") +header_sha256s=( + "c9abfdd02c45910649dd335d6bd82718e4ddd2fdb35fe550567c78f032551e0c" + "b285fa66b9c9bdc886c30ef92910da472692b25f5c6192416fb40f08f64e22ec" + "9b13328d9aec8807a754b2bc391b31b5d09b1c5f6cec064012051683ed169055" +) + +verify_sha256() { + local path="$1" expected="$2" + local actual + actual="$(sha256sum "${path}" | cut -d' ' -f1)" + if [[ "${actual}" != "${expected}" ]]; then + echo "Digest mismatch for ${path}" >&2 + echo " expected ${expected}" >&2 + echo " actual ${actual}" >&2 + exit 1 + fi +} + +mkdir -p "${cache_root}" "${include_root}" + +if [[ ! -f "${deb_path}" ]]; then + echo "Fetching ${deb_url}" + curl -fsSL -o "${deb_path}" "${deb_url}" +fi +verify_sha256 "${deb_path}" "${deb_sha256}" + +if [[ ! -f "${extract_root}/usr/lib/x86_64-linux-gnu/libmsquic.so.${version}" ]]; then + rm -rf "${extract_root}" + mkdir -p "${extract_root}" + dpkg-deb -x "${deb_path}" "${extract_root}" +fi + +for index in "${!header_names[@]}"; do + header="${header_names[${index}]}" + target="${include_root}/${header}" + if [[ ! -f "${target}" ]]; then + echo "Fetching ${header_base}/${header}" + curl -fsSL -o "${target}" "${header_base}/${header}" + fi + verify_sha256 "${target}" "${header_sha256s[${index}]}" +done + +library_directory="${extract_root}/usr/lib/x86_64-linux-gnu" +# CMake links `-lmsquic`, which wants a plain `libmsquic.so` to resolve against; +# the deb ships only the versioned file and its SONAME symlink. +ln -sf "libmsquic.so.${version}" "${library_directory}/libmsquic.so" + +cmake -S "${repo_root}/native/GameCult.Mesh.Quic.Native" -B "${build_root}" -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DMSQUIC_INCLUDE_DIR="${include_root}" \ + -DMSQUIC_LIB_DIR="${library_directory}" +cmake --build "${build_root}" + +mkdir -p "${output_directory}" +cp "${build_root}/bin/libgamecult_mesh_quic_native.so" "${output_directory}/" +# The real file under the SONAME the bridge records, not the symlink: what ships +# beside the bridge has to be a file, because the package directory is copied. +cp "${library_directory}/libmsquic.so.${version}" "${output_directory}/libmsquic.so.2" +# The deb carries three library files and no licence text, so the MIT licence +# comes from the copy this repo already committed for the Windows plugin. It is +# the same text for both platforms. +cp "${repo_root}/unity/org.gamecult.cultlib/Third Party Notices/MSQUIC-LICENSE.txt" \ + "${output_directory}/MSQUIC-LICENSE.txt" + +echo "CultMesh native QUIC runtime: ${output_directory}" +ls -l "${output_directory}" +sha256sum "${output_directory}"/* | sed "s|${output_directory}/||" From aa22b6141a2db944099231a1b7a0f0c46b9bc207 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 21:07:55 +0200 Subject: [PATCH 58/94] Record the Cut 2 fixes and Cut 3's landing, and raise Q9 The bridge is a runtime-neutral two-role event queue, built and smoked on both platforms with the Linux artifact named as development-loop only. Two hangs the old shape never exercised are pinned. One fork stops the Windows provider: the pinned Schannel flavour does not implement the PKCS12 credential the spec assumed was one type everywhere, while the same bridge passes beside the OpenSSL flavour. Recommended: pin OpenSSL on Windows and pay the tree size. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 69 +++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 6 deletions(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index f8fa0d0c..4d291849 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -43,9 +43,9 @@ have been broken since `8cb3b72`** (the scoped rename; Hands first attributed it to `8dd5a45`, which only bumped a version, and Soul corrected it) because `scripts/run-typescript-workspaces.mjs:9` names the old unscoped `cultcache-ts`; one-word fix, lands in Cut 2's fix batch. -**The runner is still named `mutate-cultmesh-authority.mjs`** while -carrying a codec target; it is renamed `scripts/mutate-cultmesh.mjs` in -the same batch and this map's references follow. +**The runner is `scripts/mutate-cultmesh.mjs`** since `65f2b66`'s batch +(renamed from `mutate-cultmesh-authority.mjs` once it carried a codec +target); every reference below that names the old path is history. **Soul's pass on Cut 2** (Fable; probes `probe-cs/`, `parity.mjs`, `symmetric.mjs` and others in the session scratchpad) held byte parity in @@ -73,9 +73,66 @@ own decoder refuses (a cast on the enum), where TypeScript refuses at encode, the stricter side; an overflow near `int.MaxValue` is reachable from hostile bytes and refused on both sides with different words; the runner's sentinel detects only the last mutant by design, and the sidecar -repair names the mutation a dead run was inside. **Cut 3 may start in -parallel**, provided the first two land before the bridge hands the codec -a `Buffer`; both are in the same Hands pass ahead of it. +repair names the mutation a dead run was inside. + +**The Cut 2 fix batch landed** (Opus) at `65f2b66` (the aggregate scripts +reach every workspace again; breakage confirmed at `8cb3b72`), `9a4c939` +(the payload copy is `new Uint8Array(bytes.subarray(…))`, because Soul's +prescribed `Uint8Array.prototype.slice.call` returns a `Buffer` from a +`Buffer` through `@@species` and fails Soul's own assertion; three crafted +negative-length frames refused; the false equivalence note gone), +`6ed0ff7` (both halves of the frame parity in CI on both OSes) and +`7a0749b` (the eleven stricter spellings named for what they are: three +backslash, two missing-authority, four host repairs, two `URL` throws; the +same slip in `isProtectedEndpoint`'s own comment fixed). 75 of 75 +mutations killed across three targets. Gap, not a workaround: `npm run +test:ts` still cannot go green on the workstation because one +`cultcache-ts` test spawns `python`, the Store alias stub here; `py -3` +has msgpack; pre-existing since `8cb3b72` and outside every cut. + +**Cut 3 landed** (Opus) at `6a091ef` (the bridge: 440 → 1,168 lines of +C++, a two-role event-queue C ABI v2 with twelve exports, the five v1 +exports kept as a Windows-only Unity shim) and `23dc093` (CMake for both +platforms, `scripts/build-quic-native.sh`, README). Host and target: +win32-x64 built and smoked on the workstation (MSVC 14.44, CMake 4.3.2); +linux-x64 built and smoked in the workstation's Docker `debian:13`, which +is the development loop and **not release-grade**; its release build is +Cut 6's Actions job. Fifteen-check FFI smoke 15 of 15 on both; the v1 gate +3 passed, 1 skipped by design; ten native mutations killed under two green +controls; exports 17 on Windows and exactly 12 on Linux with hidden +visibility; the deb digest and header sizes match the probe ledger; +manifests with SHA-256s beside every binary. Two bugs the old shape never +exercised, found by hanging tests and now mutation-pinned: the v1 +certificate pin must be attached before `ConnectionStart` (the handshake +reaches the certificate event on a worker thread at once on loopback), and +teardown must close connection handles itself because `RegistrationClose` +blocks until every child is closed. Spec discrepancies kept: `ntdll` on the +Windows link list; the deb carries no licence text, so the script copies +the committed MIT text; the deb ships no unversioned `.so` symlink, so the +script creates one; four Linux runtime libraries are load-bearing and now +in the README. Soul in flight. + +**Q9, the one fork Cut 3 hit, undecided until the operator rules.** The +pinned Windows MsQuic is the Schannel flavour, and Schannel does not +implement `QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12`: `ConfigurationLoadCredential` +returns `QUIC_STATUS_NOT_SUPPORTED`, so the provider role cannot open a +listener on Windows under it. The identical bridge DLL passes the full +smoke beside the OpenSSL 2.5.9 `msquic.dll` (SHA-256 `FEE9A664…`, +4,181,856 bytes). Linux is unaffected: Microsoft ships only the OpenSSL +build for Debian. +- **A. Pin OpenSSL on Windows.** One credential type on both platforms, + provider role works, ABI unchanged. Costs: the package URL and digest in + `build-quic-native.ps1`; the committed Windows `msquic.dll` grows from + 537 KB to 4.18 MB, so Q8's tree price becomes about 11.6 MB; the Unity + plugin's `msquic.dll` diverges until the operator's unscheduled rebuild. + The v1 client path works under either flavour. +- **B. Keep Schannel and convert PKCS12 to a certificate context via + `PFXImportCertStore`.** Keeps the pin and the Unity DLL; puts about + forty lines of Windows crypto in the shared provider path, breaking + "runtime-neutral" and the cut's own negative grep. +- **C. Providers Linux-only.** Cheapest; kills the Windows FFI smoke the + cut requires and the Windows provider lanes Cuts 4 and 5 need. +**Recommended: A.** **Cut 1 Soul findings, 2026-09-16.** Held: every test count, both negative greps, all twelve mutations rerun and killed, the control catching a From 27446e7761a917d9eec63b8148146df536322b68 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 21:29:57 +0200 Subject: [PATCH 59/94] Rule Q9: pin the OpenSSL MsQuic on Windows One credential type on both platforms, the provider role works, the ABI is unchanged. The tree pays four megabytes more and the Unity plugin's copy diverges until its rebuild. The map's claim that PKCS12 was one type for both providers is withdrawn. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index 4d291849..272a50ce 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -132,7 +132,14 @@ build for Debian. "runtime-neutral" and the cut's own negative grep. - **C. Providers Linux-only.** Cheapest; kills the Windows FFI smoke the cut requires and the Windows provider lanes Cuts 4 and 5 need. -**Recommended: A.** +**Recommended: A. Ruled A, 2026-09-16** ("A"). The Windows pin moves to +`Microsoft.Native.Quic.MsQuic.OpenSSL` 2.5.9 in `build-quic-native.ps1` +with its digest; Q8's committed tree price is restated at about 11.6 MB; +the Unity plugin's `msquic.dll` stays Schannel until the operator's +rebuild, recorded in section 15, and the v1 client path is verified under +both flavours. The spec's "one credential type for Schannel and OpenSSL" +sentence in section 8 is withdrawn: the header declares the type and only +the OpenSSL provider implements it. **Cut 1 Soul findings, 2026-09-16.** Held: every test count, both negative greps, all twelve mutations rerun and killed, the control catching a From 7badce1e4e1d263fd114b96aaae6dcb2c0fa8d19 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 21:34:24 +0200 Subject: [PATCH 60/94] Record Soul's Cut 3 pass The bridge's lifetimes are wrong: a lookup hands the host a pointer the worker can free before the next call. Release crashes on both platforms under an ordinary stream teardown. Three ABI gaps ride with it, and the return-code contract inverts between Windows and POSIX. One digest in this map was the zip's, not the DLL's. All in a fix batch before Cut 4. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 42 +++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index 272a50ce..5832bd94 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -139,7 +139,47 @@ the Unity plugin's `msquic.dll` stays Schannel until the operator's rebuild, recorded in section 15, and the v1 client path is verified under both flavours. The spec's "one credential type for Schannel and OpenSSL" sentence in section 8 is withdrawn: the header declares the type and only -the OpenSSL provider implements it. +the OpenSSL provider implements it. *(Digest correction, Soul: `FEE9A664…` +is the NuGet zip, 19,179,817 bytes; the DLL is `c17c6581…`, 4,181,856 +bytes. Hands' report and this map's first record had the zip's digest on +the DLL.)* + +**Soul's pass on Cut 3** (Fable; `soul3-*` in the session scratchpad, +including a C consumer of the ABI that is not koffi and an ASan build of +the bridge) held the Cut 2 fixes entire, the export counts, the greps, the +clean-container Linux rebuild byte-identical to the manifest, the four +load-bearing Linux runtime libraries, the stress at 16,384 frames with +zero lost or reordered on both targets, both hang mutations dying by +timeout, and both of Q9's load-bearing claims (Schannel refuses the PKCS12 +credential with not-supported; the identical bridge passes 15 of 15 beside +the OpenSSL DLL; the v1 gate passes beside either). **Cut 3 does not +close.** Found, in a fix batch (Opus): + +- **A use-after-free between the host thread and MsQuic's worker** (high): + the id lookups drop the lock and return a raw pointer, the worker frees + the object on shutdown-complete, and the host's next send dereferences + it. One in three release runs crashes on each target under an ordinary + peer-driven stream teardown; three of three under ASan. The fix is an + object kept alive across the call, not a guard. +- **Event 7 is not one per frame send**: the kind-byte send completes as + its own event with nothing to tell it apart, six events for five frames. +- **The initiator of a shutdown never learns its connection is gone**: + MsQuic gives it only shutdown-complete, which the bridge swallows. +- **Return codes invert by platform**: `QUIC_STATUS` is a negative HRESULT + on Windows and a positive errno on POSIX, so a Linux host checking for a + negative code misses every failure; the README promised negative. +- **`runtime_close` wakes a blocked poller into freed memory**; the wake + makes the pattern look supported. Close must quiesce. +- **No host-facing header**: the struct layout and the twelve signatures + live in the `.cpp` and the spec; Soul wrote its C consumer from the spec. +- Smaller: an unbounded per-connection trace string from the v1 + diagnostics; a listener config failure leaving a dead handle in the map; + a stream emplaced after start; a partial listener open leaving an entry; + a null-payload poll consuming the event; the DLL importing the VC + runtime with the README silent. + +The Q9 pin change and the manifest's stale commit line ride in the same +batch. **Cut 1 Soul findings, 2026-09-16.** Held: every test count, both negative greps, all twelve mutations rerun and killed, the control catching a From 9a01321a8a3f70c4b17df43801f9af83d8d0a584 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 21:43:01 +0200 Subject: [PATCH 61/94] Give the QUIC bridge a host-facing header Soul wrote a C consumer of this ABI from the spec text, because there was nothing to include. The struct layout, the exports and the conventions lived in the .cpp and in prose, which is three places for one contract and no way to notice when they part. include/cultmesh_quic_native.h is now the contract: the 64-byte event with every field offset asserted, the exports with their signatures, the id and return-code conventions, the object lifetime rules, and the threading rules. The .cpp includes it and keeps none of its own copy. The README points at it rather than restating it. The lifetime and return-code sections describe where the bridge is going, not where it is; the two commits after this one make them true. Co-Authored-By: Claude Opus 5 (1M context) --- .../GameCult.Mesh.Quic.Native/CMakeLists.txt | 3 + native/GameCult.Mesh.Quic.Native/README.md | 38 +-- .../cultmesh_quic_native.cpp | 54 ++-- .../include/cultmesh_quic_native.h | 302 ++++++++++++++++++ 4 files changed, 344 insertions(+), 53 deletions(-) create mode 100644 native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h diff --git a/native/GameCult.Mesh.Quic.Native/CMakeLists.txt b/native/GameCult.Mesh.Quic.Native/CMakeLists.txt index da92ffb1..f08b2f4a 100644 --- a/native/GameCult.Mesh.Quic.Native/CMakeLists.txt +++ b/native/GameCult.Mesh.Quic.Native/CMakeLists.txt @@ -10,6 +10,9 @@ endif() add_library(gamecult_mesh_quic_native SHARED cultmesh_quic_native.cpp) target_compile_features(gamecult_mesh_quic_native PRIVATE cxx_std_20) +# include/cultmesh_quic_native.h is the host-facing contract, not an internal +# detail: the bridge includes it, and so does any consumer that can. +target_include_directories(gamecult_mesh_quic_native PUBLIC include) if(WIN32) if(NOT DEFINED MSQUIC_ROOT) diff --git a/native/GameCult.Mesh.Quic.Native/README.md b/native/GameCult.Mesh.Quic.Native/README.md index b2a2ba23..4f6fa498 100644 --- a/native/GameCult.Mesh.Quic.Native/README.md +++ b/native/GameCult.Mesh.Quic.Native/README.md @@ -25,28 +25,28 @@ JavaScript engine: the bridge does not know what is on the other side. ## Two ABIs -**v2** is the runtime-neutral queue API, and the one new hosts should use: +**v2** is the runtime-neutral queue API, and the one new hosts should use. It is +stated once, in [`include/cultmesh_quic_native.h`](include/cultmesh_quic_native.h): +the 64-byte event struct with its field order and asserted offsets, the thirteen +exports with their signatures, the id and return-code conventions, the object +lifetime rules and the threading rules. That file is the contract. This README +does not restate it, and where the two ever disagree the header is right. - cultmesh_quic_runtime_open / runtime_close - cultmesh_quic_listener_open / listener_close - cultmesh_quic_connection_open / connection_certificate_complete / connection_shutdown - cultmesh_quic_stream_open / stream_send_frame / stream_shutdown - cultmesh_quic_next_event - cultmesh_quic_last_error +A host that can include it should. A host that cannot — koffi, Unity's +P/Invoke — declares the same thing in its own FFI and is checked against the +header by a test rather than by eye. -`cultmesh_quic_event` is a fixed 64-byte struct described by layout rather than -by a shared header, so a host declares it in its own FFI. Its `type` is one of: -1 `listener_new_connection`, 2 `connection_connected`, 3 -`connection_certificate_received` (payload: the DER certificate), 4 -`connection_shutdown` (payload: a UTF-8 reason), 5 `stream_started` -(`stream_kind` taken from the stream's first byte), 6 `stream_frame` (payload: -one whole encoded frame, length prefix stripped), 7 `stream_send_complete`, 8 -`stream_shutdown`, 9 `listener_stopped`. +Two things worth reading before writing a host, because they are easy to get +wrong from the outside: -`cultmesh_quic_next_event` returns 0 on timeout, 1 with the event filled and its -payload copied, 2 when the payload buffer is too small — the event stays at the -head of the queue and `out_required` is set, so the host can allocate and ask -again — and negative on a bad call. +- **Return codes are negative on a bad call, on every platform.** `-1` is a bad + call, `-2` a rejected argument, `<= -1000` a MsQuic refusal. `QUIC_STATUS` + itself is not portable — a negative HRESULT on Windows, a positive errno on + POSIX — so it never reaches a host; `cultmesh_quic_last_status` hands over the + raw value for diagnostics and nothing else. +- **`cultmesh_quic_runtime_close` quiesces.** It marks the runtime closing, wakes + every blocked `cultmesh_quic_next_event`, and waits for every in-flight call to + return before it frees anything. No host call may begin after it starts. A client connection defers certificate validation: the bridge indicates the certificate, emits event 3 carrying the DER, and answers MsQuic only when the diff --git a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp index 8c2e8884..582888eb 100644 --- a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp +++ b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp @@ -21,6 +21,13 @@ // certificate pin is compared in C, because that is the contract Unity was // shipped with; it delegates everything else and decides nothing new. +// The host-facing contract lives in include/cultmesh_quic_native.h and is +// included here so this file cannot drift from it: the event layout, the +// exports, the return codes, the lifetime rules and the threading rules are +// stated there once and asserted at compile time. +#define CULTMESH_QUIC_BUILD 1 +#include + #include #include @@ -37,35 +44,15 @@ #include #include -#if defined(_WIN32) -#define CULTMESH_API extern "C" __declspec(dllexport) -#else -#define CULTMESH_API extern "C" __attribute__((visibility("default"))) -#endif - -// The event struct crosses the ABI by layout, not by header: hosts describe it -// in their own FFI. Keep it exactly 64 bytes with no implicit padding. -extern "C" struct cultmesh_quic_event { - uint32_t type; - uint32_t stream_kind; - uint64_t listener_id; - uint64_t connection_id; - uint64_t stream_id; - uint64_t code; - int32_t status; - int32_t payload_length; - uint8_t reserved[16]; -}; -static_assert(sizeof(cultmesh_quic_event) == 64, "the event struct is a 64-byte ABI contract"); -static_assert(offsetof(cultmesh_quic_event, payload_length) == 44, "event field offsets are an ABI contract"); +#define CULTMESH_API extern "C" CULTMESH_QUIC_API namespace { constexpr uint32_t kApiVersion = 2; constexpr uint64_t kConnectionCloseCode = 0x43554c54; constexpr uint64_t kStreamAbortCode = 0x53544154; -constexpr uint8_t kReliableStream = 1; -constexpr uint8_t kLatestOnlyStream = 2; +constexpr uint8_t kReliableStream = CULTMESH_QUIC_STREAM_RELIABLE; +constexpr uint8_t kLatestOnlyStream = CULTMESH_QUIC_STREAM_LATEST_ONLY; constexpr uint32_t kMaximumEncodedFrameBytes = (64u * 1024u * 1024u) + 37u + (3u * 65535u); constexpr char kAlpn[] = "cultmesh-state-v1"; @@ -80,17 +67,16 @@ constexpr uint16_t kPeerUnidiStreamCount = 1024; // the shutdown arrives as event 4. constexpr uint32_t kHandshakeIdleTimeoutMs = 10000; -enum EventType : uint32_t { - kEventListenerNewConnection = 1, - kEventConnectionConnected = 2, - kEventConnectionCertificateReceived = 3, - kEventConnectionShutdown = 4, - kEventStreamStarted = 5, - kEventStreamFrame = 6, - kEventStreamSendComplete = 7, - kEventStreamShutdown = 8, - kEventListenerStopped = 9, -}; +// Short names for the header's event codes; the header is the contract. +constexpr uint32_t kEventListenerNewConnection = CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION; +constexpr uint32_t kEventConnectionConnected = CULTMESH_QUIC_EVENT_CONNECTION_CONNECTED; +constexpr uint32_t kEventConnectionCertificateReceived = CULTMESH_QUIC_EVENT_CONNECTION_CERTIFICATE_RECEIVED; +constexpr uint32_t kEventConnectionShutdown = CULTMESH_QUIC_EVENT_CONNECTION_SHUTDOWN; +constexpr uint32_t kEventStreamStarted = CULTMESH_QUIC_EVENT_STREAM_STARTED; +constexpr uint32_t kEventStreamFrame = CULTMESH_QUIC_EVENT_STREAM_FRAME; +constexpr uint32_t kEventStreamSendComplete = CULTMESH_QUIC_EVENT_STREAM_SEND_COMPLETE; +constexpr uint32_t kEventStreamShutdown = CULTMESH_QUIC_EVENT_STREAM_SHUTDOWN; +constexpr uint32_t kEventListenerStopped = CULTMESH_QUIC_EVENT_LISTENER_STOPPED; struct Runtime; struct Connection; diff --git a/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h b/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h new file mode 100644 index 00000000..bfe4f41f --- /dev/null +++ b/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h @@ -0,0 +1,302 @@ +/* GameCult.Mesh.Quic.Native — C ABI v2, the runtime-neutral CultMesh QUIC bridge. + * + * This header is the contract. It is the single place the event layout, the + * exports, the id and return-code conventions, the object lifetime rules and the + * threading rules are stated; `cultmesh_quic_native.cpp` includes it, the README + * points at it, and a host that cannot include it (koffi, P/Invoke) declares the + * same thing in its own FFI and is checked against this file by a test. + * + * It is C. It includes nothing of MsQuic, nothing of Node, nothing of Unity, and + * nothing platform-specific: a host binds these twelve queue exports plus + * `cultmesh_quic_last_status` and needs no other build input. + * + * The v1 Unity exports (`cultmesh_quic_open`, `_state`, `_poll`, `_error`, + * `_close`) are deliberately not here. They are a Windows-only shim for a + * shipped managed connector, not a contract offered to new hosts. + */ + +#ifndef CULTMESH_QUIC_NATIVE_H +#define CULTMESH_QUIC_NATIVE_H + +#include +#include + +#if defined(__cplusplus) +#define CULTMESH_QUIC_STATIC_ASSERT(condition, message) static_assert(condition, message) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#define CULTMESH_QUIC_STATIC_ASSERT(condition, message) _Static_assert(condition, message) +#else +#define CULTMESH_QUIC_STATIC_ASSERT(condition, message) +#endif + +/* `CULTMESH_QUIC_BUILD` is defined by the bridge's own translation unit and by + * nothing else. A consumer gets plain declarations and links by name, which is + * what every host here does: all three load the library at runtime. */ +#if defined(CULTMESH_QUIC_BUILD) +# if defined(_WIN32) +# define CULTMESH_QUIC_API __declspec(dllexport) +# else +# define CULTMESH_QUIC_API __attribute__((visibility("default"))) +# endif +#else +# define CULTMESH_QUIC_API +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +/* --------------------------------------------------------------------------- + * 1. The event + * + * Exactly 64 bytes, no implicit padding, field order below is the ABI. A host + * that reorders a field reads a different struct; the offsets are asserted here + * so a compiler that pads differently fails the build rather than the wire. + * --------------------------------------------------------------------------- */ + +struct cultmesh_quic_event { + uint32_t type; /* offset 0 — one of the cultmesh_quic_event_type values */ + uint32_t stream_kind; /* offset 4 — 1 reliable, 2 latest-only; 0 when not a stream event */ + uint64_t listener_id; /* offset 8 — 0 for an outbound connection */ + uint64_t connection_id; /* offset 16 */ + uint64_t stream_id; /* offset 24 */ + uint64_t code; /* offset 32 — meaning depends on `type`; see below */ + int32_t status; /* offset 40 — the raw platform QUIC status, diagnostics only */ + int32_t payload_length; /* offset 44 — bytes written into the caller's payload buffer */ + uint8_t reserved[16]; /* offset 48 — zero today; do not read meaning into it */ +}; + +CULTMESH_QUIC_STATIC_ASSERT(sizeof(struct cultmesh_quic_event) == 64, + "the event struct is a 64-byte ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, type) == 0, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, stream_kind) == 4, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, listener_id) == 8, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, connection_id) == 16, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, stream_id) == 24, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, code) == 32, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, status) == 40, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, payload_length) == 44, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, reserved) == 48, + "event field offsets are an ABI contract"); + +enum cultmesh_quic_event_type { + /* A listener accepted an inbound connection. `listener_id`, `connection_id`. */ + CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION = 1, + /* The handshake completed. `connection_id`. */ + CULTMESH_QUIC_EVENT_CONNECTION_CONNECTED = 2, + /* Payload: the peer's DER certificate. The handshake is blocked until the + * host answers with `cultmesh_quic_connection_certificate_complete`. */ + CULTMESH_QUIC_EVENT_CONNECTION_CERTIFICATE_RECEIVED = 3, + /* The connection is gone, whoever ended it. Payload: a UTF-8 reason. + * `code` is the QUIC application error code — the peer's when the peer + * ended it, and the code the host passed to `cultmesh_quic_connection_shutdown` + * when the host did. Emitted exactly once per connection id, including for + * the initiator of a local shutdown: every connection id's end is observable. */ + CULTMESH_QUIC_EVENT_CONNECTION_SHUTDOWN = 4, + /* An inbound stream's first byte named its kind. `stream_id`, `stream_kind`. */ + CULTMESH_QUIC_EVENT_STREAM_STARTED = 5, + /* Payload: one whole encoded frame, the 4-byte length prefix stripped. */ + CULTMESH_QUIC_EVENT_STREAM_FRAME = 6, + /* One per `cultmesh_quic_stream_send_frame` call that returned 0, and never + * for the bridge's own kind byte. `code` is a cultmesh_quic_send_result. */ + CULTMESH_QUIC_EVENT_STREAM_SEND_COMPLETE = 7, + /* The stream is gone. `stream_id`, `stream_kind`. */ + CULTMESH_QUIC_EVENT_STREAM_SHUTDOWN = 8, + /* The listener stopped. `listener_id`. */ + CULTMESH_QUIC_EVENT_LISTENER_STOPPED = 9 +}; + +/* The `code` of event 7. A canceled send is a send MsQuic released without + * putting on the wire — the stream was aborted or the connection ended under it. + * It is reported, not silently dropped. */ +enum cultmesh_quic_send_result { + CULTMESH_QUIC_SEND_COMPLETED = 0, + CULTMESH_QUIC_SEND_CANCELED = 1 +}; + +/* The first byte of every CultMesh QUIC stream. */ +enum cultmesh_quic_stream_kind { + CULTMESH_QUIC_STREAM_RELIABLE = 1, + CULTMESH_QUIC_STREAM_LATEST_ONLY = 2 +}; + +/* --------------------------------------------------------------------------- + * 2. Ids + * + * Listeners, connections and streams are named by `uint64_t` ids drawn from one + * per-runtime counter that starts at 1 and never repeats. 0 is never a valid id + * and is what an out parameter holds when a call fails. An id is the only thing + * a host ever holds: there is no host-visible pointer to a connection or stream, + * so a host cannot outlive an object it is naming. An id whose object is gone is + * a bad call (-1), not undefined behaviour. + * --------------------------------------------------------------------------- */ + +/* --------------------------------------------------------------------------- + * 3. Return codes — negative on a bad call, on every platform + * + * Every int32_t-returning export returns: + * + * 0 the call succeeded + * 1, 2 `cultmesh_quic_next_event` only; see its comment + * -1 a bad call: a null handle, a null out parameter, + * or an id whose object is gone + * -2 an argument the bridge rejects on its own terms: + * an unknown stream kind, an oversized frame, a + * listener host that is not an IP literal + * <= -1000 MsQuic refused. The bridge code is + * -(1000 + (raw_status & 0xffff)); the raw + * platform status is available from + * `cultmesh_quic_last_status` and a sentence about + * it from `cultmesh_quic_last_error`. + * + * This mapping exists because `QUIC_STATUS` itself is not portable: it is a + * negative HRESULT on Windows and a positive errno on POSIX, so a host that + * checked for a negative value saw every Linux failure as success. The mapping + * is one-way by construction — a bridge code is always negative and always + * outside the raw status space — and diagnostics go through `last_status`. + * --------------------------------------------------------------------------- */ + +#define CULTMESH_QUIC_RESULT_BAD_CALL (-1) +#define CULTMESH_QUIC_RESULT_BAD_ARGUMENT (-2) +#define CULTMESH_QUIC_RESULT_MSQUIC_BASE (-1000) + +/* --------------------------------------------------------------------------- + * 4. Object lifetime — resolved from an id, kept alive across the call + * + * The bridge's objects are shared-owned. The runtime's maps hold one reference + * each; an export that names an id takes its own reference under the lock and + * holds it for the whole MsQuic call, so an object cannot be freed under a host + * thread that is using it. MsQuic's worker, on shutdown-complete, removes the + * map entry and drops the map's reference only — it never frees an object a host + * call is inside. + * + * The MsQuic handle follows the object: it is closed exactly once, by whichever + * holder drops the last reference (or by `cultmesh_quic_runtime_close`), under a + * one-shot exchange guard. A handle is therefore valid for as long as any holder + * has a reference to its object, which is the property the host thread needs. A + * stream holds a reference to its connection, so stream handles are always + * closed before the connection handle they belong to. + * + * `cultmesh_quic_runtime_close` quiesces before it tears anything down. It marks + * the runtime closing, wakes every blocked `cultmesh_quic_next_event`, and waits + * for every in-flight export to return before it closes a handle or frees a + * byte. No host call may begin after `cultmesh_quic_runtime_close` starts: a + * call that arrives during or after it is refused with -1 and touches nothing. + * The host is responsible for that ordering; the refusal is a guard rail, not a + * licence to race. + * --------------------------------------------------------------------------- */ + +/* --------------------------------------------------------------------------- + * 5. Threading + * + * There are no host callbacks. Every crossing is the host calling in. + * + * - MsQuic's worker threads run inside this library only. They push events onto + * the runtime's queue and wake the one blocking wait. No host code is ever + * called from a thread the host does not own. + * - `cultmesh_quic_next_event` is called from host threads, one or many. It is + * the only blocking export. Concurrent callers each get a distinct event. + * - Every other export may be called from any host thread at any time, except + * during or after `cultmesh_quic_runtime_close`. + * - `cultmesh_quic_runtime_close` is called once, from one thread, and + * quiesces as described above. + * --------------------------------------------------------------------------- */ + +/* --------------------------------------------------------------------------- + * 6. The exports + * --------------------------------------------------------------------------- */ + +/* Opens a runtime: one MsQuic registration, one event queue. `app_name` may be + * null. `*out_runtime` is the opaque handle every other export takes. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_runtime_open( + const char* app_name, void** out_runtime); + +/* Quiesces, tears down and frees the runtime. Safe to call with null. After it + * returns, the handle is dead; see section 4 for the ordering rule. */ +CULTMESH_QUIC_API void cultmesh_quic_runtime_close(void* runtime); + +/* Opens a provider listener on `host`:`port` with a PKCS12 credential. `host` + * may be null or empty for any address, otherwise it must be an IP literal. + * `port` 0 binds an ephemeral port, which `*out_bound_port` reports. A failure + * leaves no listener behind and no id allocated to the host. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_listener_open( + void* runtime, const char* host, uint16_t port, + const uint8_t* pkcs12, int32_t pkcs12_length, const char* password, + uint64_t* out_listener_id, uint16_t* out_bound_port); + +/* Stops and closes a listener. Its accepted connections are not affected. + * Emits event 9. Unknown ids are ignored. */ +CULTMESH_QUIC_API void cultmesh_quic_listener_close( + void* runtime, uint64_t listener_id); + +/* Starts an outbound connection. Certificate validation is deferred: the host + * gets event 3 and must answer. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_connection_open( + void* runtime, const char* host, uint16_t port, uint64_t* out_connection_id); + +/* Answers event 3. `accept` non-zero continues the handshake; zero fails it with + * a bad-certificate alert. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_connection_certificate_complete( + void* runtime, uint64_t connection_id, int32_t accept); + +/* Ends a connection with a QUIC application error code. The initiator gets its + * own event 4 carrying `code`, as the peer does. Unknown ids are ignored. */ +CULTMESH_QUIC_API void cultmesh_quic_connection_shutdown( + void* runtime, uint64_t connection_id, uint64_t code); + +/* Opens an outbound unidirectional stream and puts `kind` on the wire as its + * first byte. That byte is the bridge's own and never produces an event 7. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_stream_open( + void* runtime, uint64_t connection_id, uint8_t kind, uint64_t* out_stream_id); + +/* Queues one whole encoded frame, length-prefixed by the bridge. A call that + * returns 0 produces exactly one event 7 later, completed or canceled. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_stream_send_frame( + void* runtime, uint64_t stream_id, + const uint8_t* encoded_frame, int32_t length, int32_t fin); + +/* Aborts a stream with a QUIC application error code. Unknown ids are ignored. */ +CULTMESH_QUIC_API void cultmesh_quic_stream_shutdown( + void* runtime, uint64_t stream_id, uint64_t code); + +/* The one blocking crossing. + * + * 0 nothing within `timeout_ms` (or the runtime is closing) + * 1 `*out_event` filled and up to `payload_capacity` payload bytes copied; + * `*out_required` is the payload size + * 2 `payload_capacity` is too small. Nothing is consumed and nothing is + * written to `*out_event`; `*out_required` is the size to allocate. Ask + * again with a big enough buffer and the same event is delivered. + * -1 a bad call, including a null `payload` with a non-zero + * `payload_capacity`, which is a lie about the buffer and is refused + * rather than treated as a discard. + * + * `payload` may be null when `payload_capacity` is 0: that is the two-phase + * poll's first ask. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_next_event( + void* runtime, int32_t timeout_ms, struct cultmesh_quic_event* out_event, + uint8_t* payload, int32_t payload_capacity, int32_t* out_required); + +/* The last error sentence, NUL-terminated, truncated to `capacity`. Returns the + * number of bytes written, or -1 on a bad call. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_last_error( + void* runtime, char* destination, int32_t capacity); + +/* The raw platform `QUIC_STATUS` behind the last <= -1000 return, as its own + * bits: a negative HRESULT on Windows, a positive errno on POSIX. Diagnostics + * only — the portable answer is the return code. 0 when nothing has failed. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_last_status(void* runtime); + +#if defined(__cplusplus) +} +#endif + +#endif /* CULTMESH_QUIC_NATIVE_H */ From 47aa7b668bb58d6ff52666d97c941436a95553c7 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 21:50:48 +0200 Subject: [PATCH 62/94] Keep bridge objects alive across the call that names them FindStream, FindConnection and FindListener took the lock, dropped it, and handed back a raw pointer. MsQuic's worker freed the object on shutdown-complete and the host thread dereferenced it on its next send. One release run in three crashed on each target under an ordinary peer-driven stream teardown; ASan caught it three times out of three, with the free inside DestroyStream on a worker and the read inside stream_send_frame on the host thread. A null check cannot fix that: the pointer is not null, it is dead. The maps hold shared_ptr now and a lookup returns a reference the caller owns for the length of its call. The worker's destroy takes the object out of its map and drops the map's reference only. The MsQuic handle follows the object: the destructor closes it exactly once, under the exchange guard, so the handle is alive for as long as any holder is. A stream holds its connection, which orders every stream handle's close before its connection's without a rule anywhere saying so. runtime_close quiesces. It marks the runtime closing, wakes every blocked poller, and waits for every in-flight call to return before it closes a handle or frees a byte; a call that arrives after that is refused with -1. Waking a poller without waiting for it was how close returned a poller into freed memory while looking like it supported the pattern. Two things fall out of the model rather than being fixed on top of it: a listener that fails partway through opening leaves no map entry and no handle, because every failure path just drops the local reference, and a stream is in the map before StreamStart, because the shutdown-complete that StreamStart can reach on a worker has to find it. Cut with it: Listener::stopped, V1Client::connection (an unread raw pointer into the same hazard), and FindListener. Event 7 is still one too many and the shutdown initiator still learns nothing; that is the next commit. The rest of Soul's C consumer passes on win32-x64, including race at 400 streams, which crashed before. Co-Authored-By: Claude Opus 5 (1M context) --- .../cultmesh_quic_native.cpp | 334 ++++++++++++------ 1 file changed, 226 insertions(+), 108 deletions(-) diff --git a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp index 582888eb..4a2d06ff 100644 --- a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp +++ b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp @@ -86,31 +86,42 @@ struct QueuedEvent { std::vector payload; }; +// Objects are shared-owned, and that is the whole lifetime model. The runtime's +// maps hold one reference each; an export that names an id takes its own +// reference under the lock and holds it for the entire MsQuic call. MsQuic's +// worker, on shutdown-complete, drops the map's reference only. The handle +// follows the object: it is closed exactly once, in the destructor, by whichever +// holder drops last, under a one-shot exchange guard. See section 4 of +// include/cultmesh_quic_native.h, which is where this is promised to hosts. + struct Stream { Runtime* runtime = nullptr; - Connection* owner = nullptr; + // Shared, not raw: this is what keeps a connection's handle open for as long + // as any of its streams still exist, so stream handles always close first. + std::shared_ptr owner; HQUIC handle = nullptr; uint64_t id = 0; uint8_t kind = 0; bool inbound = false; bool has_kind = false; + std::atomic handle_closed{false}; // Inbound reassembly only. MsQuic delivers stream bytes in arbitrary // chunks, so the length prefix and the frame it introduces can arrive in // separate receives. std::vector buffered; + + ~Stream(); }; -struct Connection { +struct Connection : std::enable_shared_from_this { Runtime* runtime = nullptr; HQUIC handle = nullptr; uint64_t id = 0; uint64_t listener_id = 0; bool inbound = false; bool closing = false; - // Two paths can reach `ConnectionClose`: the shutdown-complete callback and - // `cultmesh_quic_runtime_close`, which cannot lean on the callback because a - // silent shutdown produces none. Whoever gets here first closes; the other - // does nothing. MsQuic treats a second close of the same handle as a bug. + // Set when MsQuic is closing the handle itself (an app close already in + // progress), so the destructor's one-shot close stands down. std::atomic handle_closed{false}; // v1 only. A connection carrying a pin has its certificate answered in C // against that pin; a v2 connection never sets this and is always answered @@ -120,6 +131,8 @@ struct Connection { // v1 diagnostics: the MsQuic event sequence, which the v1 error string // reports and nothing in v2 reads. std::string trace; + + ~Connection(); }; struct Listener { @@ -127,7 +140,9 @@ struct Listener { HQUIC handle = nullptr; HQUIC configuration = nullptr; uint64_t id = 0; - bool stopped = false; + std::atomic handle_closed{false}; + + ~Listener(); }; struct Runtime { @@ -140,14 +155,64 @@ struct Runtime { std::mutex gate; std::condition_variable signal; std::deque events; - std::unordered_map> listeners; - std::unordered_map> connections; - std::unordered_map> streams; + std::unordered_map> listeners; + std::unordered_map> connections; + std::unordered_map> streams; uint64_t next_id = 1; std::string error; bool closing = false; + // Host calls currently inside the library. `cultmesh_quic_runtime_close` + // waits for this to reach zero before it touches a handle. + int active_calls = 0; }; +// Every host-facing export enters through this. It refuses once +// `cultmesh_quic_runtime_close` has started, and otherwise holds the runtime +// open for the length of the call. +class CallScope { +public: + explicit CallScope(Runtime* runtime) : runtime_(runtime) { + if (runtime_ == nullptr) return; + std::lock_guard lock(runtime_->gate); + if (runtime_->closing) return; + ++runtime_->active_calls; + entered_ = true; + } + ~CallScope() { + if (!entered_) return; + { + std::lock_guard lock(runtime_->gate); + --runtime_->active_calls; + } + runtime_->signal.notify_all(); + } + CallScope(const CallScope&) = delete; + CallScope& operator=(const CallScope&) = delete; + bool entered() const { return entered_; } + +private: + Runtime* runtime_ = nullptr; + bool entered_ = false; +}; + +Stream::~Stream() { + if (handle != nullptr && runtime != nullptr && runtime->api != nullptr && + !handle_closed.exchange(true)) + runtime->api->StreamClose(handle); +} + +Connection::~Connection() { + if (handle != nullptr && runtime != nullptr && runtime->api != nullptr && + !handle_closed.exchange(true)) + runtime->api->ConnectionClose(handle); +} + +Listener::~Listener() { + if (runtime == nullptr || runtime->api == nullptr) return; + if (handle != nullptr && !handle_closed.exchange(true)) runtime->api->ListenerClose(handle); + if (configuration != nullptr) runtime->api->ConfigurationClose(configuration); +} + // Every send buffer outlives its `StreamSend` call: MsQuic reads the bytes // asynchronously and only releases them at SEND_COMPLETE, where this is freed. struct SendRequest { @@ -221,25 +286,35 @@ uint64_t NextId(Runtime* runtime) { return runtime->next_id++; } -Listener* FindListener(Runtime* runtime, uint64_t id) { - std::lock_guard lock(runtime->gate); - const auto found = runtime->listeners.find(id); - return found == runtime->listeners.end() ? nullptr : found->second.get(); -} - -Connection* FindConnection(Runtime* runtime, uint64_t id) { +// The three lookups. Each returns a reference the caller owns for as long as it +// holds it, taken under the lock, so nothing the caller then names can be freed +// under it. A raw pointer here was the use-after-free. +std::shared_ptr FindConnection(Runtime* runtime, uint64_t id) { std::lock_guard lock(runtime->gate); const auto found = runtime->connections.find(id); - return found == runtime->connections.end() ? nullptr : found->second.get(); + return found == runtime->connections.end() ? nullptr : found->second; } -Stream* FindStream(Runtime* runtime, uint64_t id) { +std::shared_ptr FindStream(Runtime* runtime, uint64_t id) { std::lock_guard lock(runtime->gate); const auto found = runtime->streams.find(id); - return found == runtime->streams.end() ? nullptr : found->second.get(); + return found == runtime->streams.end() ? nullptr : found->second; } -void ShutdownConnectionForProtocolFault(Connection* connection, const std::string& message) { +// Takes the object out of its map and returns it, so the caller's reference — +// and any destructor it ends up running — lives outside the lock. +template +auto Detach(std::mutex& gate, Map& map, uint64_t id) { + typename Map::mapped_type detached; + std::lock_guard lock(gate); + const auto found = map.find(id); + if (found == map.end()) return detached; + detached = std::move(found->second); + map.erase(found); + return detached; +} + +void ShutdownConnectionForProtocolFault(const std::shared_ptr& connection, const std::string& message) { if (connection == nullptr) return; SetError(connection->runtime, message); if (connection->runtime->api != nullptr && connection->handle != nullptr) @@ -288,12 +363,14 @@ bool ConsumeFrames(Stream* stream) { return true; } +// Drops the map's reference and nothing else. If the map was the last holder the +// object dies here, outside the lock, and its destructor closes the handle; if a +// host call is still inside, the object outlives this by exactly that long. void DestroyStream(Runtime* runtime, uint64_t stream_id) { - std::lock_guard lock(runtime->gate); - runtime->streams.erase(stream_id); + [[maybe_unused]] const auto detached = Detach(runtime->gate, runtime->streams, stream_id); } -QUIC_STATUS QUIC_API StreamCallback(HQUIC handle, void* context, QUIC_STREAM_EVENT* event) { +QUIC_STATUS QUIC_API StreamCallback(HQUIC, void* context, QUIC_STREAM_EVENT* event) { auto* stream = static_cast(context); Runtime* runtime = stream->runtime; switch (event->Type) { @@ -314,11 +391,16 @@ QUIC_STATUS QUIC_API StreamCallback(HQUIC handle, void* context, QUIC_STREAM_EVE ShutdownConnectionForProtocolFault(stream->owner, "CultMesh QUIC stream ended with a truncated frame."); break; case QUIC_STREAM_EVENT_SHUTDOWN_COMPLETE: { + // Everything this event reports is read before the map's reference goes, + // because that reference may be the last one and `stream` may not + // survive `DestroyStream`. const uint64_t stream_id = stream->id; const uint64_t connection_id = stream->owner->id; const uint64_t listener_id = stream->owner->listener_id; const uint32_t kind = stream->kind; - if (!event->SHUTDOWN_COMPLETE.AppCloseInProgress) runtime->api->StreamClose(handle); + // An app close already in progress means MsQuic closes this handle + // itself; anything else leaves it to the last holder's destructor. + if (event->SHUTDOWN_COMPLETE.AppCloseInProgress) stream->handle_closed.store(true); DestroyStream(runtime, stream_id); PublishSimple(runtime, kEventStreamShutdown, listener_id, connection_id, stream_id, 0, 0, kind); break; @@ -330,12 +412,27 @@ QUIC_STATUS QUIC_API StreamCallback(HQUIC handle, void* context, QUIC_STREAM_EVE } void DestroyConnection(Runtime* runtime, uint64_t connection_id) { - std::lock_guard lock(runtime->gate); - for (auto it = runtime->streams.begin(); it != runtime->streams.end();) - it = it->second->owner != nullptr && it->second->owner->id == connection_id - ? runtime->streams.erase(it) - : std::next(it); - runtime->connections.erase(connection_id); + // Declared first so it dies last: whatever order these drop in, a stream + // holds its connection, so every stream handle closes before the connection + // handle does. + std::shared_ptr connection; + std::vector> streams; + { + std::lock_guard lock(runtime->gate); + for (auto it = runtime->streams.begin(); it != runtime->streams.end();) { + if (it->second->owner != nullptr && it->second->owner->id == connection_id) { + streams.push_back(std::move(it->second)); + it = runtime->streams.erase(it); + } else { + ++it; + } + } + const auto found = runtime->connections.find(connection_id); + if (found != runtime->connections.end()) { + connection = std::move(found->second); + runtime->connections.erase(found); + } + } } #if defined(_WIN32) @@ -353,9 +450,9 @@ QUIC_STATUS QUIC_API ConnectionCallback(HQUIC handle, void* context, QUIC_CONNEC PublishSimple(runtime, kEventConnectionConnected, connection->listener_id, connection->id, 0, 0, 0); break; case QUIC_CONNECTION_EVENT_PEER_STREAM_STARTED: { - auto stream = std::make_unique(); + auto stream = std::make_shared(); stream->runtime = runtime; - stream->owner = connection; + stream->owner = connection->shared_from_this(); stream->handle = event->PEER_STREAM_STARTED.Stream; stream->inbound = true; stream->id = NextId(runtime); @@ -431,8 +528,7 @@ QUIC_STATUS QUIC_API ConnectionCallback(HQUIC handle, void* context, QUIC_CONNEC } case QUIC_CONNECTION_EVENT_SHUTDOWN_COMPLETE: { const uint64_t connection_id = connection->id; - if (!event->SHUTDOWN_COMPLETE.AppCloseInProgress && !connection->handle_closed.exchange(true)) - runtime->api->ConnectionClose(handle); + if (event->SHUTDOWN_COMPLETE.AppCloseInProgress) connection->handle_closed.store(true); DestroyConnection(runtime, connection_id); break; } @@ -447,7 +543,7 @@ QUIC_STATUS QUIC_API ListenerCallback(HQUIC, void* context, QUIC_LISTENER_EVENT* Runtime* runtime = listener->runtime; switch (event->Type) { case QUIC_LISTENER_EVENT_NEW_CONNECTION: { - auto connection = std::make_unique(); + auto connection = std::make_shared(); connection->runtime = runtime; connection->handle = event->NEW_CONNECTION.Connection; connection->inbound = true; @@ -532,7 +628,7 @@ QUIC_STATUS EnsureClientConfiguration(Runtime* runtime) { // the handshake stalls waiting for an answer from a host that was never told to // give one. int32_t OpenConnection(Runtime* runtime, const char* host, uint16_t port, uint64_t* out_connection_id, - Connection** out_connection, const std::array* pin) { + const std::array* pin) { if (runtime == nullptr || host == nullptr || *host == '\0' || port == 0 || out_connection_id == nullptr) return -1; *out_connection_id = 0; @@ -544,7 +640,7 @@ int32_t OpenConnection(Runtime* runtime, const char* host, uint16_t port, uint64 return static_cast(status); } - auto connection = std::make_unique(); + auto connection = std::make_shared(); connection->runtime = runtime; connection->id = NextId(runtime); if (pin != nullptr) { @@ -561,7 +657,7 @@ int32_t OpenConnection(Runtime* runtime, const char* host, uint16_t port, uint64 } { std::lock_guard lock(runtime->gate); - runtime->connections.emplace(raw->id, std::move(connection)); + runtime->connections.emplace(raw->id, connection); } status = runtime->api->ConnectionStart( @@ -569,13 +665,13 @@ int32_t OpenConnection(Runtime* runtime, const char* host, uint16_t port, uint64 if (QUIC_FAILED(status)) { SetError(runtime, "CultMesh QUIC connection start failed (status=" + Hex(static_cast(status)) + ")."); - runtime->api->ConnectionClose(raw->handle); + // The map's reference goes and this local one goes with the scope; the + // handle is closed by whichever of the two drops last, exactly once. DestroyConnection(runtime, raw->id); return static_cast(status); } *out_connection_id = raw->id; - if (out_connection != nullptr) *out_connection = raw; return 0; } @@ -610,55 +706,52 @@ CULTMESH_API int32_t cultmesh_quic_runtime_open(const char* app_name, void** out CULTMESH_API void cultmesh_quic_runtime_close(void* handle) { auto* runtime = static_cast(handle); if (runtime == nullptr) return; + + // Quiesce before anything is closed or freed. Marking the runtime closing + // refuses every call that has not started; waking the pollers gets the + // blocked ones out of `next_event`; waiting for `active_calls` to reach zero + // is what makes the teardown below safe at all. A wake without the wait is + // how a poller returns into freed memory, so the wait is the contract, not + // the wake. Objects are taken out of the maps here and released after the + // lock, so their destructors run on this thread and close their handles. + std::vector> streams; + std::vector> connections; + std::vector> listeners; { - std::lock_guard lock(runtime->gate); + std::unique_lock lock(runtime->gate); + if (runtime->closing) return; runtime->closing = true; + runtime->signal.notify_all(); + runtime->signal.wait(lock, [runtime] { return runtime->active_calls == 0; }); + for (auto& entry : runtime->streams) streams.push_back(std::move(entry.second)); + for (auto& entry : runtime->connections) connections.push_back(std::move(entry.second)); + for (auto& entry : runtime->listeners) listeners.push_back(std::move(entry.second)); + runtime->streams.clear(); + runtime->connections.clear(); + runtime->listeners.clear(); } - runtime->signal.notify_all(); // Bottom-up, and by the app's own hand. `RegistrationClose` blocks until // every child handle the app opened has been closed *by the app*, and a // silent shutdown delivers no shutdown events at all, so leaning on the - // callbacks to do the closing deadlocks the caller forever. Connections are - // closed here; MsQuic cascades that to their streams, which arrive at - // `StreamCallback` with `AppCloseInProgress` set. - // - // The handles are copied out from under the lock and closed without it: a - // callback running concurrently takes the same lock, and `ConnectionClose` - // does not return until those callbacks have finished. - std::vector connections; - std::vector listeners; - std::vector configurations; - { - std::lock_guard lock(runtime->gate); - for (auto& entry : runtime->connections) - if (entry.second->handle != nullptr && !entry.second->handle_closed.exchange(true)) - connections.push_back(entry.second->handle); - for (auto& entry : runtime->listeners) { - if (entry.second->handle != nullptr) listeners.push_back(entry.second->handle); - if (entry.second->configuration != nullptr) configurations.push_back(entry.second->configuration); - } - } - for (HQUIC connection : connections) { - runtime->api->ConnectionShutdown(connection, QUIC_CONNECTION_SHUTDOWN_FLAG_SILENT, kConnectionCloseCode); - runtime->api->ConnectionClose(connection); - } - for (HQUIC listener : listeners) runtime->api->ListenerClose(listener); - for (HQUIC configuration : configurations) runtime->api->ConfigurationClose(configuration); + // callbacks to do the closing deadlocks the caller forever. + streams.clear(); + for (auto& connection : connections) + if (connection->handle != nullptr && !connection->handle_closed.load()) + runtime->api->ConnectionShutdown( + connection->handle, QUIC_CONNECTION_SHUTDOWN_FLAG_SILENT, kConnectionCloseCode); + connections.clear(); + listeners.clear(); if (runtime->client_configuration != nullptr) { runtime->api->ConfigurationClose(runtime->client_configuration); runtime->client_configuration = nullptr; } - // No callback can be running past this point, so the tracking maps are safe - // to drop. + // No callback can be running past this point. if (runtime->registration != nullptr) { runtime->api->RegistrationClose(runtime->registration); runtime->registration = nullptr; } - runtime->streams.clear(); - runtime->connections.clear(); - runtime->listeners.clear(); if (runtime->api != nullptr) { MsQuicClose(runtime->api); runtime->api = nullptr; @@ -673,10 +766,15 @@ CULTMESH_API int32_t cultmesh_quic_listener_open( auto* runtime = static_cast(handle); if (runtime == nullptr || pkcs12 == nullptr || pkcs12_len <= 0 || out_listener_id == nullptr) return -1; + CallScope scope(runtime); + if (!scope.entered()) return -1; *out_listener_id = 0; if (out_bound_port != nullptr) *out_bound_port = 0; - auto listener = std::make_unique(); + // Held here until the listener is fully started. Every failure path below + // simply returns: the destructor closes whatever was opened, and a partial + // open therefore leaves neither a handle nor a map entry behind. + auto listener = std::make_shared(); listener->runtime = runtime; listener->id = NextId(runtime); @@ -706,7 +804,6 @@ CULTMESH_API int32_t cultmesh_quic_listener_open( if (QUIC_FAILED(status)) { SetError(runtime, "CultMesh QUIC listener certificate could not be loaded (status=" + Hex(static_cast(status)) + ")."); - runtime->api->ConfigurationClose(listener->configuration); return static_cast(status); } @@ -715,13 +812,8 @@ CULTMESH_API int32_t cultmesh_quic_listener_open( if (QUIC_FAILED(status)) { SetError(runtime, "CultMesh QUIC listener open failed (status=" + Hex(static_cast(status)) + ")."); - runtime->api->ConfigurationClose(listener->configuration); return static_cast(status); } - { - std::lock_guard lock(runtime->gate); - runtime->listeners.emplace(raw->id, std::move(listener)); - } QUIC_ADDR address{}; QuicAddrSetFamily(&address, QUIC_ADDRESS_FAMILY_UNSPEC); @@ -731,11 +823,19 @@ CULTMESH_API int32_t cultmesh_quic_listener_open( return -2; } + // In the map before it starts accepting, because the callback that accepts + // an inbound connection reads the listener through it. + { + std::lock_guard lock(runtime->gate); + runtime->listeners.emplace(raw->id, listener); + } + QUIC_BUFFER listener_alpn = AlpnBuffer(); status = runtime->api->ListenerStart(raw->handle, &listener_alpn, 1, &address); if (QUIC_FAILED(status)) { SetError(runtime, "CultMesh QUIC listener start failed (status=" + Hex(static_cast(status)) + ")."); + Detach(runtime->gate, runtime->listeners, raw->id); return static_cast(status); } @@ -746,6 +846,7 @@ CULTMESH_API int32_t cultmesh_quic_listener_open( if (QUIC_FAILED(status)) { SetError(runtime, "CultMesh QUIC listener address could not be read (status=" + Hex(static_cast(status)) + ")."); + Detach(runtime->gate, runtime->listeners, raw->id); return static_cast(status); } if (out_bound_port != nullptr) *out_bound_port = QuicAddrGetPort(&bound); @@ -756,25 +857,29 @@ CULTMESH_API int32_t cultmesh_quic_listener_open( CULTMESH_API void cultmesh_quic_listener_close(void* handle, uint64_t listener_id) { auto* runtime = static_cast(handle); if (runtime == nullptr) return; - Listener* listener = FindListener(runtime, listener_id); - if (listener == nullptr || listener->stopped) return; - listener->stopped = true; - if (listener->handle != nullptr) runtime->api->ListenerClose(listener->handle); - if (listener->configuration != nullptr) runtime->api->ConfigurationClose(listener->configuration); - std::lock_guard lock(runtime->gate); - runtime->listeners.erase(listener_id); + CallScope scope(runtime); + if (!scope.entered()) return; + // Taken out of the map, then released here: ~Listener closes the handle + // (which is what produces event 9) and its configuration, exactly once. + [[maybe_unused]] const auto detached = Detach(runtime->gate, runtime->listeners, listener_id); } CULTMESH_API int32_t cultmesh_quic_connection_open( void* handle, const char* host, uint16_t port, uint64_t* out_connection_id) { - return OpenConnection(static_cast(handle), host, port, out_connection_id, nullptr, nullptr); + auto* runtime = static_cast(handle); + if (runtime == nullptr) return -1; + CallScope scope(runtime); + if (!scope.entered()) return -1; + return OpenConnection(runtime, host, port, out_connection_id, nullptr); } CULTMESH_API int32_t cultmesh_quic_connection_certificate_complete( void* handle, uint64_t connection_id, int32_t accept) { auto* runtime = static_cast(handle); if (runtime == nullptr) return -1; - Connection* connection = FindConnection(runtime, connection_id); + CallScope scope(runtime); + if (!scope.entered()) return -1; + const auto connection = FindConnection(runtime, connection_id); if (connection == nullptr) return -1; const auto status = runtime->api->ConnectionCertificateValidationComplete( connection->handle, @@ -791,7 +896,9 @@ CULTMESH_API int32_t cultmesh_quic_connection_certificate_complete( CULTMESH_API void cultmesh_quic_connection_shutdown(void* handle, uint64_t connection_id, uint64_t code) { auto* runtime = static_cast(handle); if (runtime == nullptr) return; - Connection* connection = FindConnection(runtime, connection_id); + CallScope scope(runtime); + if (!scope.entered()) return; + const auto connection = FindConnection(runtime, connection_id); if (connection == nullptr || connection->closing) return; connection->closing = true; if (connection->handle != nullptr) @@ -802,12 +909,14 @@ CULTMESH_API int32_t cultmesh_quic_stream_open( void* handle, uint64_t connection_id, uint8_t kind, uint64_t* out_stream_id) { auto* runtime = static_cast(handle); if (runtime == nullptr || out_stream_id == nullptr) return -1; + CallScope scope(runtime); + if (!scope.entered()) return -1; *out_stream_id = 0; if (kind != kReliableStream && kind != kLatestOnlyStream) return -2; - Connection* connection = FindConnection(runtime, connection_id); + const auto connection = FindConnection(runtime, connection_id); if (connection == nullptr) return -1; - auto stream = std::make_unique(); + auto stream = std::make_shared(); stream->runtime = runtime; stream->owner = connection; stream->kind = kind; @@ -823,17 +932,20 @@ CULTMESH_API int32_t cultmesh_quic_stream_open( Hex(static_cast(status)) + ")."); return static_cast(status); } + // In the map before it starts. `StreamStart` can reach shutdown-complete on + // an MsQuic worker before it returns here, and that callback has to find the + // stream to report it and to drop the map's reference. + { + std::lock_guard lock(runtime->gate); + runtime->streams.emplace(raw->id, stream); + } status = runtime->api->StreamStart(raw->handle, QUIC_STREAM_START_FLAG_IMMEDIATE); if (QUIC_FAILED(status)) { SetError(runtime, "CultMesh QUIC stream start failed (status=" + Hex(static_cast(status)) + ")."); - runtime->api->StreamClose(raw->handle); + DestroyStream(runtime, raw->id); return static_cast(status); } - { - std::lock_guard lock(runtime->gate); - runtime->streams.emplace(raw->id, std::move(stream)); - } // The kind byte is the first thing on the stream, which is what the peer's // reassembly reads before any length prefix. @@ -857,8 +969,12 @@ CULTMESH_API int32_t cultmesh_quic_stream_send_frame( void* handle, uint64_t stream_id, const uint8_t* encoded_frame, int32_t length, int32_t fin) { auto* runtime = static_cast(handle); if (runtime == nullptr || encoded_frame == nullptr || length <= 0) return -1; + CallScope scope(runtime); + if (!scope.entered()) return -1; if (static_cast(length) > kMaximumEncodedFrameBytes) return -2; - Stream* stream = FindStream(runtime, stream_id); + // The reference is held for the whole `StreamSend` below, so the worker + // cannot free the stream or close its handle underneath this call. + const auto stream = FindStream(runtime, stream_id); if (stream == nullptr || stream->handle == nullptr) return -1; // The bytes are copied because MsQuic reads them after this returns; the @@ -885,21 +1001,24 @@ CULTMESH_API int32_t cultmesh_quic_stream_send_frame( CULTMESH_API void cultmesh_quic_stream_shutdown(void* handle, uint64_t stream_id, uint64_t code) { auto* runtime = static_cast(handle); if (runtime == nullptr) return; - Stream* stream = FindStream(runtime, stream_id); + CallScope scope(runtime); + if (!scope.entered()) return; + const auto stream = FindStream(runtime, stream_id); if (stream == nullptr || stream->handle == nullptr) return; runtime->api->StreamShutdown(stream->handle, QUIC_STREAM_SHUTDOWN_FLAG_ABORT, code); } -// The one blocking crossing. Returns 0 on timeout, 1 with the event filled and -// its payload copied, 2 when `payload_capacity` is too small (the event stays at -// the head of the queue and `out_required` is set), negative on a bad call. This -// is the v1 two-phase poll convention applied to a queue of typed events. +// The one blocking crossing; see section 6 of the header for its returns. The +// call scope is what `cultmesh_quic_runtime_close` waits on: a poller blocked +// here is woken by `closing` and counted out before anything is freed. CULTMESH_API int32_t cultmesh_quic_next_event( void* handle, int32_t timeout_ms, cultmesh_quic_event* out_event, uint8_t* payload, int32_t payload_capacity, int32_t* out_required) { auto* runtime = static_cast(handle); if (runtime == nullptr || out_event == nullptr || out_required == nullptr || payload_capacity < 0) return -1; + CallScope scope(runtime); + if (!scope.entered()) return -1; *out_required = 0; std::unique_lock lock(runtime->gate); @@ -926,6 +1045,8 @@ CULTMESH_API int32_t cultmesh_quic_next_event( CULTMESH_API int32_t cultmesh_quic_last_error(void* handle, char* destination, int32_t capacity) { auto* runtime = static_cast(handle); if (runtime == nullptr || destination == nullptr || capacity <= 0) return -1; + CallScope scope(runtime); + if (!scope.entered()) return -1; std::lock_guard lock(runtime->gate); const size_t count = (std::min)(runtime->error.size(), static_cast(capacity - 1)); std::memcpy(destination, runtime->error.data(), count); @@ -961,7 +1082,6 @@ enum class ClientState : int32_t { struct V1Client { Runtime* runtime = nullptr; - Connection* connection = nullptr; uint64_t connection_id = 0; ClientState state = ClientState::Connecting; std::deque> frames; @@ -1090,13 +1210,11 @@ CULTMESH_API int32_t cultmesh_quic_open( client->runtime = static_cast(runtime_handle); // The pin goes in before the connection starts; see OpenConnection. - Connection* connection = nullptr; - const auto status = OpenConnection(client->runtime, host, port, &client->connection_id, &connection, &pin); + const auto status = OpenConnection(client->runtime, host, port, &client->connection_id, &pin); if (status != 0) { cultmesh_quic_runtime_close(client->runtime); return status; } - client->connection = connection; *result = client.release(); return 0; From 8c418961c45b9c12df9987af0a70b298006bfb2e Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 22:00:06 +0200 Subject: [PATCH 63/94] Close the three ABI gaps the bridge left open MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Event 7 was not one per frame. The bridge writes the stream's kind byte itself, that send completed as an anonymous event 7, and a host counting completions saw six for five frames with nothing to tell them apart. The send request now says which send it was; the kind byte's completion is the bridge's own business and is dropped. A send MsQuic released without putting on the wire reports it: event 7 carries a send result in `code`, completed or canceled, so an aborted send is accounted for rather than silently missing. Measured: 32 sends queued under an abort, 32 event 7, 28 canceled and 4 completed. The initiator of a shutdown learned nothing. MsQuic gives it only shutdown-complete, and the bridge swallowed that, so a host could end its own connection and never see the id end. Event 4 now has one emitter — shutdown-complete — and the two initiated-by callbacks record why rather than announcing it. Each connection id gets exactly one event 4, whoever ended it, with the code its side passed, and it is emitted after the id has stopped resolving, so a host told a connection is gone cannot still resolve it on the next line. Return codes inverted by platform. QUIC_STATUS is a negative HRESULT on Windows and a positive errno on POSIX, so a Linux host checking for a negative code saw every failure as success, against a README that promised negative. A MsQuic refusal is now -(1000 + (status & 0xffff)) on both, and cultmesh_quic_last_status hands over the raw bits for diagnostics. On win32-x64 a garbage PKCS12 returns -12032 with last_status 0x80072B18. The v1 exports move with it; the managed connector tests the value against zero and formats it, so the contract it was shipped with holds. Smaller ones, from the same pass: AppendTrace is v1-only and bounded, because a long-lived v2 connection grew that string once per MsQuic event for nothing to read; a listener configuration failure takes the connection out of the map instead of leaving it naming a handle MsQuic is about to close; and next_event refuses a null payload with a non-zero capacity rather than treating the lie as a discard. Soul's C consumer now compiles against the header and asserts its own struct and its eleven bound prototypes against it, and the koffi smoke checks its declarations and the thirteen exports the same way: 20 of 20, seq clean, cancel clean, the v1 gate 3 passed 1 skipped as before. Co-Authored-By: Claude Opus 5 (1M context) --- .../cultmesh_quic_native.cpp | 185 ++++++++++++------ .../include/cultmesh_quic_native.h | 15 +- 2 files changed, 135 insertions(+), 65 deletions(-) diff --git a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp index 4a2d06ff..a7326e68 100644 --- a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp +++ b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp @@ -119,7 +119,16 @@ struct Connection : std::enable_shared_from_this { uint64_t id = 0; uint64_t listener_id = 0; bool inbound = false; - bool closing = false; + // Written by the host thread in `cultmesh_quic_connection_shutdown`, read on + // an MsQuic worker when the shutdown completes: the code the host passed is + // what its own event 4 has to carry. + std::atomic closing{false}; + std::atomic shutdown_code{0}; + // Why it ended, recorded by whichever initiated-by callback saw it and read + // by shutdown-complete, which is the single emitter of event 4. Both run on + // this connection's own worker, serialized. + std::string shutdown_reason; + int32_t shutdown_status = 0; // Set when MsQuic is closing the handle itself (an app close already in // progress), so the destructor's one-shot close stands down. std::atomic handle_closed{false}; @@ -160,6 +169,9 @@ struct Runtime { std::unordered_map> streams; uint64_t next_id = 1; std::string error; + // The raw platform status behind the last MsQuic refusal, kept because the + // portable return code deliberately throws its bits away. + int32_t last_status = 0; bool closing = false; // Host calls currently inside the library. `cultmesh_quic_runtime_close` // waits for this to reach zero before it touches a handle. @@ -218,6 +230,10 @@ Listener::~Listener() { struct SendRequest { QUIC_BUFFER buffer{}; std::vector bytes; + // Which send this was. The bridge writes the stream's kind byte itself, and + // that completion is not the host's to hear about; event 7 is one per + // `cultmesh_quic_stream_send_frame` and nothing else. + bool is_frame = false; }; std::string Hex(uint64_t value) { @@ -232,6 +248,24 @@ void SetError(Runtime* runtime, const std::string& message) { runtime->error = message; } +// `QUIC_STATUS` never reaches a host. It is a negative HRESULT on Windows and a +// positive errno on POSIX, so a host that checked for a negative value saw every +// Linux failure as success. One negative space on both platforms instead; the +// raw bits go to `cultmesh_quic_last_status`. See section 3 of the header. +int32_t MsQuicCode(QUIC_STATUS status) { + return CULTMESH_QUIC_RESULT_MSQUIC_BASE - + static_cast(static_cast(status) & 0xffffu); +} + +int32_t Refuse(Runtime* runtime, QUIC_STATUS status, const std::string& message) { + if (runtime != nullptr) { + std::lock_guard lock(runtime->gate); + runtime->error = message; + runtime->last_status = static_cast(status); + } + return MsQuicCode(status); +} + // The only way anything reaches the host. Callers must not hold `gate`. void Publish(Runtime* runtime, const cultmesh_quic_event& header, const uint8_t* payload, size_t payload_length) { QueuedEvent queued; @@ -260,9 +294,14 @@ void PublishSimple(Runtime* runtime, uint32_t type, uint64_t listener_id, uint64 Publish(runtime, header, nullptr, 0); } +// v1 diagnostics only, and bounded. A v2 connection has no reader for this, and +// a long-lived one appended to it once per MsQuic event for as long as it lived. +constexpr size_t kMaximumTraceBytes = 512; + void AppendTrace(Connection* connection, const std::string& event) { - if (connection == nullptr) return; + if (connection == nullptr || !connection->has_pin) return; std::lock_guard lock(connection->runtime->gate); + if (connection->trace.size() >= kMaximumTraceBytes) return; if (!connection->trace.empty()) connection->trace += ","; connection->trace += event; } @@ -381,11 +420,22 @@ QUIC_STATUS QUIC_API StreamCallback(HQUIC, void* context, QUIC_STREAM_EVENT* eve } ConsumeFrames(stream); break; - case QUIC_STREAM_EVENT_SEND_COMPLETE: - delete static_cast(event->SEND_COMPLETE.ClientContext); - PublishSimple(runtime, kEventStreamSendComplete, stream->owner->listener_id, stream->owner->id, - stream->id, 0, 0, stream->kind); + case QUIC_STREAM_EVENT_SEND_COMPLETE: { + // Which send finished is the client context's job to say. Without it the + // bridge's own kind byte completed as an anonymous event 7 and the host + // counted six completions for five frames. + auto* request = static_cast(event->SEND_COMPLETE.ClientContext); + const bool is_frame = request != nullptr && request->is_frame; + delete request; + if (is_frame) + PublishSimple(runtime, kEventStreamSendComplete, stream->owner->listener_id, stream->owner->id, + stream->id, + event->SEND_COMPLETE.Canceled + ? CULTMESH_QUIC_SEND_CANCELED + : CULTMESH_QUIC_SEND_COMPLETED, + 0, stream->kind); break; + } case QUIC_STREAM_EVENT_PEER_SEND_SHUTDOWN: if (!stream->buffered.empty()) ShutdownConnectionForProtocolFault(stream->owner, "CultMesh QUIC stream ended with a truncated frame."); @@ -503,33 +553,41 @@ QUIC_STATUS QUIC_API ConnectionCallback(HQUIC handle, void* context, QUIC_CONNEC Publish(runtime, header, der, der_length); return QUIC_STATUS_PENDING; } - case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_TRANSPORT: { - const std::string reason = "CultMesh QUIC connection was shut down by the transport (status=" + + // The two initiated-by events say why a connection is ending, not that it + // has ended; the object and its id are still live here. They record the + // reason and the code, and shutdown-complete below is the one place event 4 + // is emitted, once per connection id, after the id has stopped resolving. + // All three of these run on the connection's own MsQuic worker, serialized, + // which is what lets these fields be plain members. + case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_TRANSPORT: + connection->shutdown_reason = "CultMesh QUIC connection was shut down by the transport (status=" + Hex(static_cast(event->SHUTDOWN_INITIATED_BY_TRANSPORT.Status)) + ", error=" + Hex(event->SHUTDOWN_INITIATED_BY_TRANSPORT.ErrorCode) + ")."; - cultmesh_quic_event header{}; - header.type = kEventConnectionShutdown; - header.listener_id = connection->listener_id; - header.connection_id = connection->id; - header.code = event->SHUTDOWN_INITIATED_BY_TRANSPORT.ErrorCode; - header.status = static_cast(event->SHUTDOWN_INITIATED_BY_TRANSPORT.Status); - Publish(runtime, header, reinterpret_cast(reason.data()), reason.size()); + connection->shutdown_code.store(event->SHUTDOWN_INITIATED_BY_TRANSPORT.ErrorCode); + connection->shutdown_status = static_cast(event->SHUTDOWN_INITIATED_BY_TRANSPORT.Status); break; - } - case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_PEER: { - const std::string reason = "CultMesh QUIC connection was shut down by the peer."; - cultmesh_quic_event header{}; - header.type = kEventConnectionShutdown; - header.listener_id = connection->listener_id; - header.connection_id = connection->id; - header.code = event->SHUTDOWN_INITIATED_BY_PEER.ErrorCode; - Publish(runtime, header, reinterpret_cast(reason.data()), reason.size()); + case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_PEER: + connection->shutdown_reason = "CultMesh QUIC connection was shut down by the peer."; + connection->shutdown_code.store(event->SHUTDOWN_INITIATED_BY_PEER.ErrorCode); break; - } case QUIC_CONNECTION_EVENT_SHUTDOWN_COMPLETE: { const uint64_t connection_id = connection->id; if (event->SHUTDOWN_COMPLETE.AppCloseInProgress) connection->handle_closed.store(true); + // A host that ended the connection itself gets nothing else from MsQuic + // — no initiated-by-peer, no initiated-by-transport — so without this + // its own connection id simply stopped existing and the end of a + // connection was observable only from the other side. + cultmesh_quic_event header{}; + header.type = kEventConnectionShutdown; + header.listener_id = connection->listener_id; + header.connection_id = connection_id; + header.code = connection->shutdown_code.load(); + header.status = connection->shutdown_status; + const std::string reason = connection->shutdown_reason.empty() + ? std::string("CultMesh QUIC connection was shut down by the host.") + : connection->shutdown_reason; DestroyConnection(runtime, connection_id); + Publish(runtime, header, reinterpret_cast(reason.data()), reason.size()); break; } default: @@ -561,6 +619,11 @@ QUIC_STATUS QUIC_API ListenerCallback(HQUIC, void* context, QUIC_LISTENER_EVENT* if (QUIC_FAILED(status)) { SetError(runtime, "CultMesh QUIC inbound connection configuration failed (status=" + Hex(static_cast(status)) + ")."); + // Returning a failure here is MsQuic's signal to reject and close + // this connection itself, so the entry made a moment ago has to go + // with it rather than sitting in the map naming a dead handle. + raw->handle_closed.store(true); + DestroyConnection(runtime, raw->id); return status; } PublishSimple(runtime, kEventListenerNewConnection, listener->id, raw->id, 0, 0, 0); @@ -635,9 +698,8 @@ int32_t OpenConnection(Runtime* runtime, const char* host, uint16_t port, uint64 auto status = EnsureClientConfiguration(runtime); if (QUIC_FAILED(status)) { - SetError(runtime, "CultMesh QUIC client configuration failed (status=" + + return Refuse(runtime, status, "CultMesh QUIC client configuration failed (status=" + Hex(static_cast(status)) + ")."); - return static_cast(status); } auto connection = std::make_shared(); @@ -651,9 +713,8 @@ int32_t OpenConnection(Runtime* runtime, const char* host, uint16_t port, uint64 status = runtime->api->ConnectionOpen(runtime->registration, ConnectionCallback, raw, &raw->handle); if (QUIC_FAILED(status)) { - SetError(runtime, "CultMesh QUIC connection open failed (status=" + + return Refuse(runtime, status, "CultMesh QUIC connection open failed (status=" + Hex(static_cast(status)) + ")."); - return static_cast(status); } { std::lock_guard lock(runtime->gate); @@ -663,12 +724,11 @@ int32_t OpenConnection(Runtime* runtime, const char* host, uint16_t port, uint64 status = runtime->api->ConnectionStart( raw->handle, runtime->client_configuration, QUIC_ADDRESS_FAMILY_UNSPEC, host, port); if (QUIC_FAILED(status)) { - SetError(runtime, "CultMesh QUIC connection start failed (status=" + - Hex(static_cast(status)) + ")."); // The map's reference goes and this local one goes with the scope; the // handle is closed by whichever of the two drops last, exactly once. DestroyConnection(runtime, raw->id); - return static_cast(status); + return Refuse(runtime, status, "CultMesh QUIC connection start failed (status=" + + Hex(static_cast(status)) + ")."); } *out_connection_id = raw->id; @@ -686,8 +746,10 @@ CULTMESH_API int32_t cultmesh_quic_runtime_open(const char* app_name, void** out *out_runtime = nullptr; auto runtime = std::make_unique(); + // No runtime yet to hang `last_status` on, so these two refusals lose the + // raw bits. Everything after this point keeps them. auto status = MsQuicOpenVersion(kApiVersion, reinterpret_cast(&runtime->api)); - if (QUIC_FAILED(status)) return static_cast(status); + if (QUIC_FAILED(status)) return MsQuicCode(status); const QUIC_REGISTRATION_CONFIG registration_config = { (app_name != nullptr && *app_name != '\0') ? app_name : "GameCult.Mesh.Quic.Native", @@ -696,7 +758,7 @@ CULTMESH_API int32_t cultmesh_quic_runtime_open(const char* app_name, void** out status = runtime->api->RegistrationOpen(®istration_config, &runtime->registration); if (QUIC_FAILED(status)) { MsQuicClose(runtime->api); - return static_cast(status); + return MsQuicCode(status); } *out_runtime = runtime.release(); @@ -784,9 +846,8 @@ CULTMESH_API int32_t cultmesh_quic_listener_open( auto status = runtime->api->ConfigurationOpen( runtime->registration, &alpn, 1, &settings, sizeof(settings), nullptr, &listener->configuration); if (QUIC_FAILED(status)) { - SetError(runtime, "CultMesh QUIC listener configuration failed (status=" + + return Refuse(runtime, status, "CultMesh QUIC listener configuration failed (status=" + Hex(static_cast(status)) + ")."); - return static_cast(status); } // PKCS12 is the one credential type Schannel and OpenSSL both take, which @@ -802,17 +863,15 @@ CULTMESH_API int32_t cultmesh_quic_listener_open( credentials.Flags = QUIC_CREDENTIAL_FLAG_NONE; status = runtime->api->ConfigurationLoadCredential(listener->configuration, &credentials); if (QUIC_FAILED(status)) { - SetError(runtime, "CultMesh QUIC listener certificate could not be loaded (status=" + + return Refuse(runtime, status, "CultMesh QUIC listener certificate could not be loaded (status=" + Hex(static_cast(status)) + ")."); - return static_cast(status); } Listener* raw = listener.get(); status = runtime->api->ListenerOpen(runtime->registration, ListenerCallback, raw, &raw->handle); if (QUIC_FAILED(status)) { - SetError(runtime, "CultMesh QUIC listener open failed (status=" + + return Refuse(runtime, status, "CultMesh QUIC listener open failed (status=" + Hex(static_cast(status)) + ")."); - return static_cast(status); } QUIC_ADDR address{}; @@ -833,10 +892,9 @@ CULTMESH_API int32_t cultmesh_quic_listener_open( QUIC_BUFFER listener_alpn = AlpnBuffer(); status = runtime->api->ListenerStart(raw->handle, &listener_alpn, 1, &address); if (QUIC_FAILED(status)) { - SetError(runtime, "CultMesh QUIC listener start failed (status=" + - Hex(static_cast(status)) + ")."); Detach(runtime->gate, runtime->listeners, raw->id); - return static_cast(status); + return Refuse(runtime, status, "CultMesh QUIC listener start failed (status=" + + Hex(static_cast(status)) + ")."); } // Port 0 means "pick one"; the host needs the chosen port to advertise it. @@ -844,10 +902,9 @@ CULTMESH_API int32_t cultmesh_quic_listener_open( uint32_t bound_size = sizeof(bound); status = runtime->api->GetParam(raw->handle, QUIC_PARAM_LISTENER_LOCAL_ADDRESS, &bound_size, &bound); if (QUIC_FAILED(status)) { - SetError(runtime, "CultMesh QUIC listener address could not be read (status=" + - Hex(static_cast(status)) + ")."); Detach(runtime->gate, runtime->listeners, raw->id); - return static_cast(status); + return Refuse(runtime, status, "CultMesh QUIC listener address could not be read (status=" + + Hex(static_cast(status)) + ")."); } if (out_bound_port != nullptr) *out_bound_port = QuicAddrGetPort(&bound); *out_listener_id = raw->id; @@ -886,9 +943,8 @@ CULTMESH_API int32_t cultmesh_quic_connection_certificate_complete( accept != 0 ? static_cast(1) : static_cast(0), accept != 0 ? QUIC_TLS_ALERT_CODE_SUCCESS : QUIC_TLS_ALERT_CODE_BAD_CERTIFICATE); if (QUIC_FAILED(status)) { - SetError(runtime, "CultMesh QUIC certificate validation completion failed (status=" + + return Refuse(runtime, status, "CultMesh QUIC certificate validation completion failed (status=" + Hex(static_cast(status)) + ")."); - return static_cast(status); } return 0; } @@ -899,8 +955,10 @@ CULTMESH_API void cultmesh_quic_connection_shutdown(void* handle, uint64_t conne CallScope scope(runtime); if (!scope.entered()) return; const auto connection = FindConnection(runtime, connection_id); - if (connection == nullptr || connection->closing) return; - connection->closing = true; + if (connection == nullptr || connection->closing.exchange(true)) return; + // Kept for the shutdown-complete callback: this is the code the initiator's + // own event 4 carries, matching the one the peer sees. + connection->shutdown_code.store(code); if (connection->handle != nullptr) runtime->api->ConnectionShutdown(connection->handle, QUIC_CONNECTION_SHUTDOWN_FLAG_NONE, code); } @@ -928,9 +986,8 @@ CULTMESH_API int32_t cultmesh_quic_stream_open( connection->handle, QUIC_STREAM_OPEN_FLAG_UNIDIRECTIONAL, StreamCallback, raw, &raw->handle); if (QUIC_FAILED(status)) { - SetError(runtime, "CultMesh QUIC stream open failed (status=" + + return Refuse(runtime, status, "CultMesh QUIC stream open failed (status=" + Hex(static_cast(status)) + ")."); - return static_cast(status); } // In the map before it starts. `StreamStart` can reach shutdown-complete on // an MsQuic worker before it returns here, and that callback has to find the @@ -941,10 +998,9 @@ CULTMESH_API int32_t cultmesh_quic_stream_open( } status = runtime->api->StreamStart(raw->handle, QUIC_STREAM_START_FLAG_IMMEDIATE); if (QUIC_FAILED(status)) { - SetError(runtime, "CultMesh QUIC stream start failed (status=" + - Hex(static_cast(status)) + ")."); DestroyStream(runtime, raw->id); - return static_cast(status); + return Refuse(runtime, status, "CultMesh QUIC stream start failed (status=" + + Hex(static_cast(status)) + ")."); } // The kind byte is the first thing on the stream, which is what the peer's @@ -956,9 +1012,8 @@ CULTMESH_API int32_t cultmesh_quic_stream_open( status = runtime->api->StreamSend(raw->handle, &request->buffer, 1, QUIC_SEND_FLAG_NONE, request); if (QUIC_FAILED(status)) { delete request; - SetError(runtime, "CultMesh QUIC stream kind could not be sent (status=" + + return Refuse(runtime, status, "CultMesh QUIC stream kind could not be sent (status=" + Hex(static_cast(status)) + ")."); - return static_cast(status); } *out_stream_id = raw->id; @@ -981,6 +1036,7 @@ CULTMESH_API int32_t cultmesh_quic_stream_send_frame( // 4-byte LE length prefix is the QUIC stream framing, and it is added here // so that framing lives in one place for both directions. auto* request = new SendRequest(); + request->is_frame = true; request->bytes.resize(sizeof(uint32_t) + static_cast(length)); WriteUInt32LittleEndian(request->bytes.data(), static_cast(length)); std::memcpy(request->bytes.data() + sizeof(uint32_t), encoded_frame, static_cast(length)); @@ -991,9 +1047,8 @@ CULTMESH_API int32_t cultmesh_quic_stream_send_frame( const auto status = runtime->api->StreamSend(stream->handle, &request->buffer, 1, flags, request); if (QUIC_FAILED(status)) { delete request; - SetError(runtime, "CultMesh QUIC frame send failed (status=" + + return Refuse(runtime, status, "CultMesh QUIC frame send failed (status=" + Hex(static_cast(status)) + ")."); - return static_cast(status); } return 0; } @@ -1017,6 +1072,9 @@ CULTMESH_API int32_t cultmesh_quic_next_event( auto* runtime = static_cast(handle); if (runtime == nullptr || out_event == nullptr || out_required == nullptr || payload_capacity < 0) return -1; + // A null buffer with a non-zero capacity is a lie about the buffer. Taking + // it meant the event was consumed and its payload silently dropped. + if (payload == nullptr && payload_capacity > 0) return -1; CallScope scope(runtime); if (!scope.entered()) return -1; *out_required = 0; @@ -1054,6 +1112,15 @@ CULTMESH_API int32_t cultmesh_quic_last_error(void* handle, char* destination, i return static_cast(count); } +CULTMESH_API int32_t cultmesh_quic_last_status(void* handle) { + auto* runtime = static_cast(handle); + if (runtime == nullptr) return 0; + CallScope scope(runtime); + if (!scope.entered()) return 0; + std::lock_guard lock(runtime->gate); + return runtime->last_status; +} + // --------------------------------------------------------------------------- // C ABI v1: the Unity shim. Windows only, by the same construction as its only // caller (`CultMeshNativeQuicRealtimeTransport.CanConnect` is Windows-gated). diff --git a/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h b/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h index bfe4f41f..1d984a97 100644 --- a/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h +++ b/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h @@ -95,11 +95,12 @@ enum cultmesh_quic_event_type { /* Payload: the peer's DER certificate. The handshake is blocked until the * host answers with `cultmesh_quic_connection_certificate_complete`. */ CULTMESH_QUIC_EVENT_CONNECTION_CERTIFICATE_RECEIVED = 3, - /* The connection is gone, whoever ended it. Payload: a UTF-8 reason. - * `code` is the QUIC application error code — the peer's when the peer - * ended it, and the code the host passed to `cultmesh_quic_connection_shutdown` - * when the host did. Emitted exactly once per connection id, including for - * the initiator of a local shutdown: every connection id's end is observable. */ + /* The connection is gone, whoever ended it, and its id no longer resolves. + * Payload: a UTF-8 reason. `code` is the QUIC application error code — the + * peer's when the peer ended it, and the code the host passed to + * `cultmesh_quic_connection_shutdown` when the host did. Emitted exactly + * once per connection id, including for the initiator of a local shutdown: + * every connection id's end is observable from the host that owns it. */ CULTMESH_QUIC_EVENT_CONNECTION_SHUTDOWN = 4, /* An inbound stream's first byte named its kind. `stream_id`, `stream_kind`. */ CULTMESH_QUIC_EVENT_STREAM_STARTED = 5, @@ -269,7 +270,9 @@ CULTMESH_QUIC_API void cultmesh_quic_stream_shutdown( /* The one blocking crossing. * - * 0 nothing within `timeout_ms` (or the runtime is closing) + * 0 nothing within `timeout_ms`. A poller already blocked here when + * `cultmesh_quic_runtime_close` starts is woken and returns 0; one that + * arrives after it starts is refused with -1 like any other call. * 1 `*out_event` filled and up to `payload_capacity` payload bytes copied; * `*out_required` is the payload size * 2 `payload_capacity` is too small. Nothing is consumed and nothing is From c729dff2ee82a2a87ad5a9c65ec8a006d1b6f637 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 22:04:27 +0200 Subject: [PATCH 64/94] Pin the Windows MsQuic to the OpenSSL build, and both of its digests Q9 ruled A. The Schannel MsQuic refuses QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12 with QUIC_STATUS_NOT_SUPPORTED, and PKCS12 is the only credential type a provider has on both platforms, so a Windows provider could not open a listener against the runtime this repo was shipping. The same bridge binary passes all twenty smoke checks and the v1 gate against the OpenSSL build, which is what Soul verified and what this now downloads. Two digests, not one. The zip is pinned by FEE9A664 and 19,179,817 bytes; the msquic.dll inside it by C17C6581 and 4,181,856 bytes. The earlier report and the cut map's first record put the zip's digest on the DLL, which is a pin that checks the archive and then ships a file nobody looked at. Sizes ride along with both, because a digest that fails tells you less than a digest and a length that fail together. The CRT is linked statically. A Node or Unity host without the Visual C++ redistributable cannot load a DLL that imports vcruntime140.dll, and Windows reports that as "the specified module could not be found" while naming the module that was found. Confirmed on the rebuild: msquic.dll, CRYPT32, ntdll, KERNEL32, and no CRT import at all. The DLL goes from 83,456 to 302,080 bytes, which is the price of the host not needing anything installed. The Unity plugin's committed msquic.dll is still the Schannel one and this does not touch it; the next build-unity-package.ps1 run is what replaces it, and that is not in this batch. Co-Authored-By: Claude Opus 5 (1M context) --- .../GameCult.Mesh.Quic.Native/CMakeLists.txt | 9 +++- native/GameCult.Mesh.Quic.Native/README.md | 13 ++++- scripts/build-quic-native.ps1 | 49 +++++++++++++------ scripts/build-unity-package.ps1 | 2 +- 4 files changed, 54 insertions(+), 19 deletions(-) diff --git a/native/GameCult.Mesh.Quic.Native/CMakeLists.txt b/native/GameCult.Mesh.Quic.Native/CMakeLists.txt index f08b2f4a..936002cc 100644 --- a/native/GameCult.Mesh.Quic.Native/CMakeLists.txt +++ b/native/GameCult.Mesh.Quic.Native/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.24) project(gamecult_mesh_quic_native LANGUAGES CXX) -# Two platforms, one source. Windows takes MsQuic from the pinned Schannel NuGet +# Two platforms, one source. Windows takes MsQuic from the pinned OpenSSL NuGet # layout (MSQUIC_ROOT); Linux takes it from the extracted libmsquic deb, whose # headers and library land in unrelated places, so they are named separately. if(NOT WIN32 AND NOT (CMAKE_SYSTEM_NAME STREQUAL "Linux")) @@ -16,8 +16,13 @@ target_include_directories(gamecult_mesh_quic_native PUBLIC include) if(WIN32) if(NOT DEFINED MSQUIC_ROOT) - message(FATAL_ERROR "MSQUIC_ROOT must point at the extracted Microsoft.Native.Quic.MsQuic.Schannel package build/native directory") + message(FATAL_ERROR "MSQUIC_ROOT must point at the extracted Microsoft.Native.Quic.MsQuic.OpenSSL package build/native directory") endif() + # Static CRT. A Node or Unity host without the Visual C++ redistributable + # installed cannot load a DLL that imports vcruntime140.dll, and the failure + # arrives as "the specified module could not be found" with nothing naming the + # missing runtime. The bridge carries its own instead. + set_property(TARGET gamecult_mesh_quic_native PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") target_compile_definitions(gamecult_mesh_quic_native PRIVATE WIN32_LEAN_AND_MEAN NOMINMAX) target_include_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_ROOT}/include") target_link_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_ROOT}/lib/x64") diff --git a/native/GameCult.Mesh.Quic.Native/README.md b/native/GameCult.Mesh.Quic.Native/README.md index 4f6fa498..adc256a0 100644 --- a/native/GameCult.Mesh.Quic.Native/README.md +++ b/native/GameCult.Mesh.Quic.Native/README.md @@ -69,8 +69,17 @@ Windows x64, from the repo root: powershell -File scripts/build-quic-native.ps1 -MsQuic comes from a pinned NuGet package verified by SHA-256, and the build uses -MSVC with `/Brepro` so a rebuild reproduces the committed Unity plugin DLL. +MsQuic comes from `Microsoft.Native.Quic.MsQuic.OpenSSL` 2.5.9, pinned twice: the +NuGet zip by digest and size, and the `msquic.dll` inside it by digest and size, +because the archive is what the download is checked against and the DLL is what +actually ships beside the bridge. The OpenSSL flavour rather than Schannel +because Schannel's MsQuic refuses `QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12`, +which is the only credential type a provider has on both platforms. + +The build uses MSVC with `/Brepro` so a rebuild reproduces the committed Unity +plugin DLL, and links the CRT statically (`/MT`). A Node or Unity host without +the Visual C++ redistributable cannot load a DLL that imports `vcruntime140.dll`, +and the failure it reports names no missing runtime; the bridge carries its own. Linux x64, on a Debian 13 host: diff --git a/scripts/build-quic-native.ps1 b/scripts/build-quic-native.ps1 index f1b35787..553152d0 100644 --- a/scripts/build-quic-native.ps1 +++ b/scripts/build-quic-native.ps1 @@ -14,9 +14,21 @@ if ($Architecture -ne "x64") { $repoRoot = Split-Path -Parent $PSScriptRoot $version = "2.5.9" -$expectedPackageSha256 = "9877A919E1AA73AA4800F1E8A06B6539021F376228910138EB04540CD956617B" -$cacheRoot = Join-Path $repoRoot "artifacts\dependencies\msquic-schannel-$version" -$packagePath = Join-Path $cacheRoot "Microsoft.Native.Quic.MsQuic.Schannel.$version.zip" +# OpenSSL, not Schannel (Q9 ruled A). The Schannel build of MsQuic refuses +# QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12 with QUIC_STATUS_NOT_SUPPORTED, which +# is the only credential type a provider has on both platforms, so a Windows +# provider could not open a listener at all. The identical bridge binary passes +# the whole v2 smoke and the v1 gate against this runtime. +# +# Two digests, because they answer different questions. The zip is what the +# download is pinned to; the DLL is what actually ships beside the bridge, and +# pinning only the archive leaves the file nobody checked. +$expectedPackageSha256 = "FEE9A664C0052DEEE66D40CED2E19BFE20BC423DE5AE5234CFC0CEBC22CA3F5E" +$expectedPackageBytes = 19179817 +$expectedRuntimeSha256 = "C17C65813FE007EB486A5270D244F3659261355795B27ABB99BD19FF77539263" +$expectedRuntimeBytes = 4181856 +$cacheRoot = Join-Path $repoRoot "artifacts\dependencies\msquic-openssl-$version" +$packagePath = Join-Path $cacheRoot "Microsoft.Native.Quic.MsQuic.OpenSSL.$version.zip" $extractRoot = Join-Path $cacheRoot "package" $nativeRoot = Join-Path $extractRoot "build\native" $buildRoot = Join-Path $repoRoot "artifacts\quic-native-build\$Architecture\$Configuration" @@ -26,27 +38,36 @@ $outputRoot = if ([IO.Path]::IsPathRooted($OutputDirectory)) { Join-Path $repoRoot $OutputDirectory } +function Assert-Pinned { + param([string] $Path, [string] $ExpectedSha256, [long] $ExpectedBytes, [string] $What) + $actualBytes = (Get-Item -LiteralPath $Path).Length + $sha256 = [Security.Cryptography.SHA256]::Create() + try { + $stream = [IO.File]::OpenRead($Path) + try { $actualSha256 = [BitConverter]::ToString($sha256.ComputeHash($stream)).Replace("-", "") } + finally { $stream.Dispose() } + } finally { $sha256.Dispose() } + if ($actualSha256 -ne $ExpectedSha256 -or $actualBytes -ne $ExpectedBytes) { + throw ("$What does not match the pinned release: " + + "expected $ExpectedSha256 ($ExpectedBytes bytes), got $actualSha256 ($actualBytes bytes).") + } +} + New-Item -ItemType Directory -Force -Path $cacheRoot | Out-Null if (-not (Test-Path -LiteralPath $packagePath)) { & curl.exe -L --fail --silent --show-error ` -o $packagePath ` - "https://www.nuget.org/api/v2/package/Microsoft.Native.Quic.MsQuic.Schannel/$version" + "https://www.nuget.org/api/v2/package/Microsoft.Native.Quic.MsQuic.OpenSSL/$version" if ($LASTEXITCODE -ne 0) { throw "MsQuic package download failed with exit code $LASTEXITCODE" } } -$sha256 = [Security.Cryptography.SHA256]::Create() -try { - $packageBytes = [IO.File]::ReadAllBytes($packagePath) - $packageSha256 = [BitConverter]::ToString($sha256.ComputeHash($packageBytes)).Replace("-", "") -} finally { - $sha256.Dispose() -} -if ($packageSha256 -ne $expectedPackageSha256) { - throw "MsQuic package digest does not match the pinned release." -} +Assert-Pinned -Path $packagePath -ExpectedSha256 $expectedPackageSha256 ` + -ExpectedBytes $expectedPackageBytes -What "The MsQuic NuGet package" if (-not (Test-Path -LiteralPath (Join-Path $nativeRoot "include\msquic.h"))) { if (Test-Path -LiteralPath $extractRoot) { Remove-Item -LiteralPath $extractRoot -Recurse -Force } Expand-Archive -LiteralPath $packagePath -DestinationPath $extractRoot } +Assert-Pinned -Path (Join-Path $nativeRoot "bin\x64\msquic.dll") ` + -ExpectedSha256 $expectedRuntimeSha256 -ExpectedBytes $expectedRuntimeBytes -What "The MsQuic runtime DLL" cmake -S (Join-Path $repoRoot "native\GameCult.Mesh.Quic.Native") -B $buildRoot -A x64 ` "-DMSQUIC_ROOT=$($nativeRoot.Replace('\', '/'))" diff --git a/scripts/build-unity-package.ps1 b/scripts/build-unity-package.ps1 index 8e425066..377a1586 100644 --- a/scripts/build-unity-package.ps1 +++ b/scripts/build-unity-package.ps1 @@ -193,4 +193,4 @@ $manifest = Get-Content -LiteralPath (Join-Path $outputRoot "package.json") -Raw Write-Host "CultLib Unity package: $outputRoot" Write-Host "Package: $($manifest.name)@$($manifest.version)" Write-Host "Managed assemblies: $($expectedAssemblies.Count)" -Write-Host "Native realtime: MsQuic Schannel 2.5.9 (Windows x64)" +Write-Host "Native realtime: MsQuic OpenSSL 2.5.9 (Windows x64)" From e1ce4915b6f2b4aee573f6e79023fa722f82b6e0 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 22:24:51 +0200 Subject: [PATCH 65/94] Record the Cut 3 fix batch The bridge keeps an object alive across the call that names it, closes each handle exactly once, and quiesces before it frees. The contract is a header hosts and tests are checked against. Return codes are negative on every platform, one completion per frame, and every connection's end is observable. One mutation survived by construction and is handed to Soul to rule on. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 34 ++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index 5832bd94..ff37affa 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -181,6 +181,40 @@ close.** Found, in a fix batch (Opus): The Q9 pin change and the manifest's stale commit line ride in the same batch. +**The Cut 3 fix batch landed** (Opus; its commits are signed Opus 5, which +is what ran) at `9a01321` (`include/cultmesh_quic_native.h`, 305 lines: +the event struct with offsets static-asserted, every export, the id and +return-code conventions, the lifetime and threading rules; the koffi smoke +and Soul's C consumer are checked against it), `47aa7b6` (objects kept +alive across the call that names them: one `shared_ptr` per map entry, a +lookup returns a reference the caller holds for the whole MsQuic call, the +worker drops only the map's reference, the handle closes exactly once in +the destructor under the exchange guard, a stream owns its connection so +close order is structural; `runtime_close` marks closing, wakes pollers, +waits for `active_calls == 0`, and refuses any later call), `8c41896` (the +ABI gaps: one event 7 per frame send with `Canceled` distinct; event 4 +uniform at completion for every path, the initiator included, published +after the id stops resolving; return codes mapped negative on every +platform with `cultmesh_quic_last_status` for the raw status, thirteen v2 +exports now; a null payload with capacity refused; a stream in the map +before start; failed listeners leaving nothing) and `c729dff` (the OpenSSL +pin with both digests, `/MT` so the DLL imports no CRT, manifests with a +real commit line). Host and target: win32-x64 on the workstation, 20 of 20 +smoke checks, the C consumer's seq, cancel, stress (16,384 frames, zero +lost or reordered), race 400×20 with zero crashes, closerace 20×512, the v1 +gate 3 passed 1 skipped, 18 exports; linux-x64 in the workstation's Docker +`debian:13`, development loop only, the same set plus ASan clean on every +mode, 13 exports. 22 of 23 mutations killed under two green controls. +**L3 survived**: deleting the quiesce wait cannot be caught, because the +wake happens under the lock and every poller drains before teardown; right +by construction and by reading, unfalsifiable by this harness. Soul rules +whether that stands or a dev-only probe asserts the invariant. Open after +the batch: the Unity plugin's `msquic.dll` is still Schannel until the +package build runs; the Schannel dependency cache is orphaned; the v1 +return-code values changed while the zero-versus-nonzero contract held. +Bridge 302,080 bytes / `f4c5f644…` (win32-x64, static CRT), 108,128 / +`61d5b96e…` (linux-x64). Soul rerun in flight. + **Cut 1 Soul findings, 2026-09-16.** Held: every test count, both negative greps, all twelve mutations rerun and killed, the control catching a truncated write, the equivalent mutant confirmed (Node 24 WebCrypto refuses From 27ae3cb292ca88a0a9b82f2f4395dab99a34987d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 22:58:15 +0200 Subject: [PATCH 66/94] Record Soul's second pass, and rule the surviving mutation killable The cut does not close. The lifetime model was right in shape and wrong by one line: the last call notifies after it has released the lock, so the runtime can be destroyed in between and the wake lands on freed memory. A sanitizer found it on the unmutated bridge. The mutation that survived by construction is ruled killable rather than accepted. Under a sanitizer with pollers blocked mid-copy it fails four times in forty-eight, so a dev-only assertion makes it fail every time instead. Two further mutations are honest only on the sanitizer target and the table must say so, because a mutation whose kill depends on the target is not killed until it runs there. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 55 ++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index ff37affa..257998bc 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -21,7 +21,8 @@ landed at `c64a2da`, `6c933d0`, `fe2555d`. TypeScript-written frame vectors, each decoded by the other side, the C# test reading both with the reference alone) and `ae29910` (37 entries as a third runner target; 72 of 72 across the three targets killed, one -equivalent named). Soul in flight. Hands' discrepancies, kept: the +equivalent named). Closed 2026-09-16 after Soul's pass and one fix batch. +Hands' discrepancies, kept: the 65,535-byte identity and 64 MiB payload ceilings recorded as a build rule plus the digest of the whole encoding rather than half a megabyte of literal text; the Body has five refusal messages where the spec listed six @@ -112,7 +113,7 @@ the committed MIT text; the deb ships no unversioned `.so` symlink, so the script creates one; four Linux runtime libraries are load-bearing and now in the README. Soul in flight. -**Q9, the one fork Cut 3 hit, undecided until the operator rules.** The +**Q9, the one fork Cut 3 hit, ruled A on 2026-09-16 (detail below).** The pinned Windows MsQuic is the Schannel flavour, and Schannel does not implement `QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12`: `ConfigurationLoadCredential` returns `QUIC_STATUS_NOT_SUPPORTED`, so the provider role cannot open a @@ -213,7 +214,55 @@ the batch: the Unity plugin's `msquic.dll` is still Schannel until the package build runs; the Schannel dependency cache is orphaned; the v1 return-code values changed while the zero-versus-nonzero contract held. Bridge 302,080 bytes / `f4c5f644…` (win32-x64, static CRT), 108,128 / -`61d5b96e…` (linux-x64). Soul rerun in flight. +`61d5b96e…` (linux-x64). + +**Soul's second pass on the fix batch** (Fable; `soul3b-*` in the session +scratchpad, its C consumer extended with close, re-entry and completion-race +scenarios, ThreadSanitizer and AddressSanitizer on linux-x64 in the +workstation's Docker `debian:13`). Held: the lifetime model, race 400×20 with +zero crashes on both targets and ASan clean on every mode; 16,384 of 16,384 +frames under stress with none lost or reordered; one completion event per +frame with cancellation distinct; the completion event uniform at the end of +every connection, with its mutant killed on both targets; negative return +codes everywhere; the null-payload refusal; the header compiling clean as +both C and C++ under maximum warnings on two compilers with no padding and +no implicit conversion; no C runtime import; the OpenSSL pin re-downloaded +and both digests equal; the version-one gate green beside either flavour of +the library. **The cut does not close at `c729dff`.** Findings: + +- **The quiesce is one line short, and it is a use-after-free.** `~CallScope` + decrements the call count under the lock, releases it, and only then + notifies. The closer's predicate is already true, so if that last poller is + preempted in between, the runtime is destroyed and the notify lands on a + freed condition variable. ThreadSanitizer caught it on the **unmutated** + bridge, so the previous batch's model was right in shape and wrong by one + line. Confirmed, medium, and the blocker. +- **The header oversells the return code.** It is portably negative, not + portably meaningful: the same failure is −12032 on Windows and −1126 on + Linux, and the Windows mask collides two distinct statuses onto −1002. The + sign is the contract; the magnitude is diagnostic. Low, wording. +- **The previous batch's own README claims a rebuild reproduces the committed + Unity plugin.** It does not: that plugin is the older Schannel build at + 40,448 bytes with a C runtime import, against 302,080 bytes without one + today. Low, and exactly the stale-artifact trap. The current build does + reproduce itself. +- **A Windows status sign-extends in diagnostics**, printing sixteen hex + digits. Trivial. + +**L3 is ruled: it becomes killable, it is not accepted as unfalsifiable.** +Soul established the survival was a harness limit rather than a proof of +correctness. Under AddressSanitizer with pollers blocked mid-copy of large +frames, deleting the quiesce wait hit use-after-free four times in +forty-eight attempts, while the release scenario never observed it. So a +dev-only assertion now aborts when the call count is non-zero after the +quiesce block, which fires deterministically with enough blocked pollers and +makes the mutation die by the existing scenario; the sanitizer run stays as +the second check. That assertion does not cover the defect above, where the +count has already reached zero. **Two mutations are honest only on the +sanitizer target:** the pop-then-copy one and the closed-handle one survive +on Windows release and kill three times of three under AddressSanitizer, so +the entries table must say which target each is honest on. A mutation whose +kill depends on the target is not killed until it runs there. **Cut 1 Soul findings, 2026-09-16.** Held: every test count, both negative greps, all twelve mutations rerun and killed, the control catching a From a4753f4e9fd35ca0326512d9999cc81c0ff3e103 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 23:18:26 +0200 Subject: [PATCH 67/94] Notify the closer while still holding the gate A call scope used to drop the lock after decrementing the in-flight count and notify afterwards. That left a window: the closer's predicate is already true once the count reaches zero, so a scope preempted between the unlock and the notify could come back to find the runtime torn down and signal a condition variable that no longer exists. ThreadSanitizer reports it as a broadcast racing the destroy. The decrement and the notify now happen under one lock guard. The closer cannot return from its wait until the scope releases the gate, so the condition variable is alive for as long as anything can signal it. Co-Authored-By: Claude Opus 5 --- .../cultmesh_quic_native.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp index a7326e68..14ebc344 100644 --- a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp +++ b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp @@ -190,12 +190,16 @@ public: ++runtime_->active_calls; entered_ = true; } + // The notify stays under `gate`, and that is the whole point of it. Released + // first, the closer's predicate is already true, so it can return from its + // wait, run the teardown and destroy the runtime — condition variable + // included — before this thread reaches the notify. Holding the lock across + // both means the closer cannot leave `signal.wait` until this scope has let + // go, so the condition variable is still alive when it is signalled. ~CallScope() { if (!entered_) return; - { - std::lock_guard lock(runtime_->gate); - --runtime_->active_calls; - } + std::lock_guard lock(runtime_->gate); + --runtime_->active_calls; runtime_->signal.notify_all(); } CallScope(const CallScope&) = delete; From dc9e12cd38106591443a20f3fbbc857e951013a7 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 23:20:55 +0200 Subject: [PATCH 68/94] Print a Windows status without sign-extending it Every error sentence widened its QUIC_STATUS straight to uint64_t. On Windows that status is a signed HRESULT, so the sentence carried 0xFFFFFFFF80072B18 where the status is 0x80072B18. The status is 32 bits on both platforms and now goes through uint32_t on its way in. Diagnostics only: the v1 managed connector matches on the wording of these sentences, not on the hex. Co-Authored-By: Claude Opus 5 --- .../cultmesh_quic_native.cpp | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp index 14ebc344..b5aacb16 100644 --- a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp +++ b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp @@ -240,6 +240,10 @@ struct SendRequest { bool is_frame = false; }; +// A `QUIC_STATUS` reaches this through `uint32_t`, never straight to `uint64_t`: +// it is a signed HRESULT on Windows, and widening it signed printed every +// Windows failure as `0xFFFFFFFF80072B18`. The status is 32 bits on both +// platforms and is read as 32 bits here. std::string Hex(uint64_t value) { std::ostringstream text; text << "0x" << std::hex << std::uppercase << value; @@ -522,7 +526,7 @@ QUIC_STATUS QUIC_API ConnectionCallback(HQUIC handle, void* context, QUIC_CONNEC case QUIC_CONNECTION_EVENT_PEER_CERTIFICATE_RECEIVED: { const auto* encoded = reinterpret_cast(event->PEER_CERTIFICATE_RECEIVED.Certificate); AppendTrace(connection, "certificate-status=" + - Hex(static_cast(event->PEER_CERTIFICATE_RECEIVED.DeferredStatus))); + Hex(static_cast(event->PEER_CERTIFICATE_RECEIVED.DeferredStatus))); #if defined(_WIN32) if (connection->has_pin) { // The v1 contract: the pin decision is made here, in C, and the host @@ -538,7 +542,7 @@ QUIC_STATUS QUIC_API ConnectionCallback(HQUIC handle, void* context, QUIC_CONNEC matches ? QUIC_TLS_ALERT_CODE_SUCCESS : QUIC_TLS_ALERT_CODE_BAD_CERTIFICATE); if (QUIC_FAILED(completion)) { SetError(runtime, "CultMesh QUIC certificate validation completion failed (status=" + - Hex(static_cast(completion)) + ")."); + Hex(static_cast(completion)) + ")."); return completion; } return QUIC_STATUS_PENDING; @@ -565,7 +569,7 @@ QUIC_STATUS QUIC_API ConnectionCallback(HQUIC handle, void* context, QUIC_CONNEC // which is what lets these fields be plain members. case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_TRANSPORT: connection->shutdown_reason = "CultMesh QUIC connection was shut down by the transport (status=" + - Hex(static_cast(event->SHUTDOWN_INITIATED_BY_TRANSPORT.Status)) + ", error=" + + Hex(static_cast(event->SHUTDOWN_INITIATED_BY_TRANSPORT.Status)) + ", error=" + Hex(event->SHUTDOWN_INITIATED_BY_TRANSPORT.ErrorCode) + ")."; connection->shutdown_code.store(event->SHUTDOWN_INITIATED_BY_TRANSPORT.ErrorCode); connection->shutdown_status = static_cast(event->SHUTDOWN_INITIATED_BY_TRANSPORT.Status); @@ -622,7 +626,7 @@ QUIC_STATUS QUIC_API ListenerCallback(HQUIC, void* context, QUIC_LISTENER_EVENT* event->NEW_CONNECTION.Connection, listener->configuration); if (QUIC_FAILED(status)) { SetError(runtime, "CultMesh QUIC inbound connection configuration failed (status=" + - Hex(static_cast(status)) + ")."); + Hex(static_cast(status)) + ")."); // Returning a failure here is MsQuic's signal to reject and close // this connection itself, so the entry made a moment ago has to go // with it rather than sitting in the map naming a dead handle. @@ -703,7 +707,7 @@ int32_t OpenConnection(Runtime* runtime, const char* host, uint16_t port, uint64 auto status = EnsureClientConfiguration(runtime); if (QUIC_FAILED(status)) { return Refuse(runtime, status, "CultMesh QUIC client configuration failed (status=" + - Hex(static_cast(status)) + ")."); + Hex(static_cast(status)) + ")."); } auto connection = std::make_shared(); @@ -718,7 +722,7 @@ int32_t OpenConnection(Runtime* runtime, const char* host, uint16_t port, uint64 status = runtime->api->ConnectionOpen(runtime->registration, ConnectionCallback, raw, &raw->handle); if (QUIC_FAILED(status)) { return Refuse(runtime, status, "CultMesh QUIC connection open failed (status=" + - Hex(static_cast(status)) + ")."); + Hex(static_cast(status)) + ")."); } { std::lock_guard lock(runtime->gate); @@ -732,7 +736,7 @@ int32_t OpenConnection(Runtime* runtime, const char* host, uint16_t port, uint64 // handle is closed by whichever of the two drops last, exactly once. DestroyConnection(runtime, raw->id); return Refuse(runtime, status, "CultMesh QUIC connection start failed (status=" + - Hex(static_cast(status)) + ")."); + Hex(static_cast(status)) + ")."); } *out_connection_id = raw->id; @@ -851,7 +855,7 @@ CULTMESH_API int32_t cultmesh_quic_listener_open( runtime->registration, &alpn, 1, &settings, sizeof(settings), nullptr, &listener->configuration); if (QUIC_FAILED(status)) { return Refuse(runtime, status, "CultMesh QUIC listener configuration failed (status=" + - Hex(static_cast(status)) + ")."); + Hex(static_cast(status)) + ")."); } // PKCS12 is the one credential type Schannel and OpenSSL both take, which @@ -868,14 +872,14 @@ CULTMESH_API int32_t cultmesh_quic_listener_open( status = runtime->api->ConfigurationLoadCredential(listener->configuration, &credentials); if (QUIC_FAILED(status)) { return Refuse(runtime, status, "CultMesh QUIC listener certificate could not be loaded (status=" + - Hex(static_cast(status)) + ")."); + Hex(static_cast(status)) + ")."); } Listener* raw = listener.get(); status = runtime->api->ListenerOpen(runtime->registration, ListenerCallback, raw, &raw->handle); if (QUIC_FAILED(status)) { return Refuse(runtime, status, "CultMesh QUIC listener open failed (status=" + - Hex(static_cast(status)) + ")."); + Hex(static_cast(status)) + ")."); } QUIC_ADDR address{}; @@ -898,7 +902,7 @@ CULTMESH_API int32_t cultmesh_quic_listener_open( if (QUIC_FAILED(status)) { Detach(runtime->gate, runtime->listeners, raw->id); return Refuse(runtime, status, "CultMesh QUIC listener start failed (status=" + - Hex(static_cast(status)) + ")."); + Hex(static_cast(status)) + ")."); } // Port 0 means "pick one"; the host needs the chosen port to advertise it. @@ -908,7 +912,7 @@ CULTMESH_API int32_t cultmesh_quic_listener_open( if (QUIC_FAILED(status)) { Detach(runtime->gate, runtime->listeners, raw->id); return Refuse(runtime, status, "CultMesh QUIC listener address could not be read (status=" + - Hex(static_cast(status)) + ")."); + Hex(static_cast(status)) + ")."); } if (out_bound_port != nullptr) *out_bound_port = QuicAddrGetPort(&bound); *out_listener_id = raw->id; @@ -948,7 +952,7 @@ CULTMESH_API int32_t cultmesh_quic_connection_certificate_complete( accept != 0 ? QUIC_TLS_ALERT_CODE_SUCCESS : QUIC_TLS_ALERT_CODE_BAD_CERTIFICATE); if (QUIC_FAILED(status)) { return Refuse(runtime, status, "CultMesh QUIC certificate validation completion failed (status=" + - Hex(static_cast(status)) + ")."); + Hex(static_cast(status)) + ")."); } return 0; } @@ -991,7 +995,7 @@ CULTMESH_API int32_t cultmesh_quic_stream_open( StreamCallback, raw, &raw->handle); if (QUIC_FAILED(status)) { return Refuse(runtime, status, "CultMesh QUIC stream open failed (status=" + - Hex(static_cast(status)) + ")."); + Hex(static_cast(status)) + ")."); } // In the map before it starts. `StreamStart` can reach shutdown-complete on // an MsQuic worker before it returns here, and that callback has to find the @@ -1004,7 +1008,7 @@ CULTMESH_API int32_t cultmesh_quic_stream_open( if (QUIC_FAILED(status)) { DestroyStream(runtime, raw->id); return Refuse(runtime, status, "CultMesh QUIC stream start failed (status=" + - Hex(static_cast(status)) + ")."); + Hex(static_cast(status)) + ")."); } // The kind byte is the first thing on the stream, which is what the peer's @@ -1017,7 +1021,7 @@ CULTMESH_API int32_t cultmesh_quic_stream_open( if (QUIC_FAILED(status)) { delete request; return Refuse(runtime, status, "CultMesh QUIC stream kind could not be sent (status=" + - Hex(static_cast(status)) + ")."); + Hex(static_cast(status)) + ")."); } *out_stream_id = raw->id; @@ -1052,7 +1056,7 @@ CULTMESH_API int32_t cultmesh_quic_stream_send_frame( if (QUIC_FAILED(status)) { delete request; return Refuse(runtime, status, "CultMesh QUIC frame send failed (status=" + - Hex(static_cast(status)) + ")."); + Hex(static_cast(status)) + ")."); } return 0; } From 53d59296d4f0cc33c61e44eb45b4c45eb7af6411 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 23:21:50 +0200 Subject: [PATCH 69/94] Say what the return code makes portable Section 3 and cultmesh_quic_last_status both told a host that the portable answer is the return code. What the mapping makes portable is the sign. The magnitude is not: the same MsQuic failure carries different numbers on different platforms, a TLS error being -12032 on win32-x64 and -1126 on linux-x64, and the 16-bit mask gives QUIC_STATUS_USER_CANCELED and QUIC_STATUS_FILE_NOT_FOUND the same -1002 on Windows. The header now says the sign is what a host may branch on, that the magnitude is diagnostic and platform-specific, and that switching on a particular code identifies nothing reliably. Co-Authored-By: Claude Opus 5 --- .../include/cultmesh_quic_native.h | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h b/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h index 1d984a97..94c8b5b7 100644 --- a/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h +++ b/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h @@ -160,9 +160,18 @@ enum cultmesh_quic_stream_kind { * * This mapping exists because `QUIC_STATUS` itself is not portable: it is a * negative HRESULT on Windows and a positive errno on POSIX, so a host that - * checked for a negative value saw every Linux failure as success. The mapping - * is one-way by construction — a bridge code is always negative and always - * outside the raw status space — and diagnostics go through `last_status`. + * checked for a negative value saw every Linux failure as success. + * + * What the mapping makes portable is the sign, and only the sign. A failure is + * negative everywhere, and that is what a host may branch on. The magnitude of a + * <= -1000 code is diagnostic and platform-specific: the same MsQuic failure + * carries different numbers on different platforms (a TLS error is -12032 on + * win32-x64 and -1126 on linux-x64; an ALPN already in use is -1009 against + * -1091), and the 16-bit mask can give two distinct statuses the same code + * (`QUIC_STATUS_USER_CANCELED` and `QUIC_STATUS_FILE_NOT_FOUND` are both -1002 + * on Windows). Switching on a particular code is therefore not portable and not + * a reliable identification of the failure. Report it, log it, and read + * `cultmesh_quic_last_status` and `cultmesh_quic_last_error` beside it. * --------------------------------------------------------------------------- */ #define CULTMESH_QUIC_RESULT_BAD_CALL (-1) @@ -295,7 +304,8 @@ CULTMESH_QUIC_API int32_t cultmesh_quic_last_error( /* The raw platform `QUIC_STATUS` behind the last <= -1000 return, as its own * bits: a negative HRESULT on Windows, a positive errno on POSIX. Diagnostics - * only — the portable answer is the return code. 0 when nothing has failed. */ + * only; what is portable about the return code is its sign, not its value. 0 + * when nothing has failed. */ CULTMESH_QUIC_API int32_t cultmesh_quic_last_status(void* runtime); #if defined(__cplusplus) From 19d8d5c94810e6b825d491cc3500ca792dd5ff93 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 23:22:59 +0200 Subject: [PATCH 70/94] Say that the committed Unity plugin is the older build The README claimed a rebuild reproduces the committed Unity plugin DLL. It does not. That plugin is 40,448 bytes, predates both the static CRT and the move off Schannel, and still imports VCRUNTIME140.dll and MSVCP140.dll; the current source builds to 302,080 bytes with no CRT import. What /Brepro buys is that a build reproduces itself, and the README now says that, along with the fact that the committed plugin stays the older build until the Unity package build replaces it. Co-Authored-By: Claude Opus 5 --- native/GameCult.Mesh.Quic.Native/README.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/native/GameCult.Mesh.Quic.Native/README.md b/native/GameCult.Mesh.Quic.Native/README.md index adc256a0..60531975 100644 --- a/native/GameCult.Mesh.Quic.Native/README.md +++ b/native/GameCult.Mesh.Quic.Native/README.md @@ -76,11 +76,19 @@ actually ships beside the bridge. The OpenSSL flavour rather than Schannel because Schannel's MsQuic refuses `QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12`, which is the only credential type a provider has on both platforms. -The build uses MSVC with `/Brepro` so a rebuild reproduces the committed Unity -plugin DLL, and links the CRT statically (`/MT`). A Node or Unity host without -the Visual C++ redistributable cannot load a DLL that imports `vcruntime140.dll`, +The build uses MSVC with `/Brepro` so that a build reproduces itself: the link +timestamps are dropped, and building the same source twice gives the same bytes. +It links the CRT statically (`/MT`), because a Node or Unity host without the +Visual C++ redistributable cannot load a DLL that imports `vcruntime140.dll`, and the failure it reports names no missing runtime; the bridge carries its own. +A rebuild does not reproduce the committed Unity plugin. That plugin +(`unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/gamecult_mesh_quic_native.dll`, +40,448 bytes) is the older build — before `/MT` and before the move off +Schannel — and it still imports `VCRUNTIME140.dll` and `MSVCP140.dll`. The +current source builds to 302,080 bytes with no CRT import. The committed plugin +stays the older build until the Unity package build runs and replaces it. + Linux x64, on a Debian 13 host: scripts/build-quic-native.sh From f4186e7427ec7c44f839467ca6567ac07eab7dbb Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 23:23:30 +0200 Subject: [PATCH 71/94] Run the runtime-lifetime scenarios from the repository The bridge's close path had no committed test. Whether a close is safe against host threads already inside the library is the one thing about it a host cannot establish by reading, and every check of it so far lived in a session scratchpad and is gone. The scenario runner under tests/ drives that path and nothing else: it parks pollers in cultmesh_quic_next_event, closes the runtime under them, and asserts that the close is what woke them. It consumes the bridge through the public header, as a host does. CULTMESH_QUIC_BUILD_TESTS builds it, off by default, because a delivery build has no business producing an executable. CULTMESH_QUIC_DEBUG_ASSERTS, also off by default, makes the bridge state the quiesce invariant itself rather than leaving it to whatever a sanitizer happens to catch. Deleting the quiesce wait is otherwise falsifiable only by luck: AddressSanitizer saw it 4 times in 48 attempts with pollers blocked mid-copy of large frames, and never on release. With the assertion and pollers blocked it fails on the first close. Co-Authored-By: Claude Opus 5 --- .../GameCult.Mesh.Quic.Native/CMakeLists.txt | 32 ++++ .../cultmesh_quic_native.cpp | 26 +++ .../tests/cultmesh_quic_native_tests.cpp | 151 ++++++++++++++++++ 3 files changed, 209 insertions(+) create mode 100644 native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp diff --git a/native/GameCult.Mesh.Quic.Native/CMakeLists.txt b/native/GameCult.Mesh.Quic.Native/CMakeLists.txt index 936002cc..87f877b2 100644 --- a/native/GameCult.Mesh.Quic.Native/CMakeLists.txt +++ b/native/GameCult.Mesh.Quic.Native/CMakeLists.txt @@ -54,3 +54,35 @@ set_target_properties(gamecult_mesh_quic_native PROPERTIES OUTPUT_NAME "gamecult_mesh_quic_native" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + +# The runtime-lifetime scenarios. Off by default: the shipped artifact is the +# library alone, and a delivery build has no business producing an executable. +# CULTMESH_QUIC_DEBUG_ASSERTS goes with them, never into a shipped binary — it +# makes the bridge state the quiesce invariant instead of leaving it to whatever +# a sanitizer happens to catch. +option(CULTMESH_QUIC_BUILD_TESTS "Build the runtime-lifetime scenario runner" OFF) +option(CULTMESH_QUIC_DEBUG_ASSERTS "Abort the bridge on a violated internal invariant" OFF) + +if(CULTMESH_QUIC_DEBUG_ASSERTS) + target_compile_definitions(gamecult_mesh_quic_native PRIVATE CULTMESH_QUIC_DEBUG_ASSERTS) +endif() + +if(CULTMESH_QUIC_BUILD_TESTS) + add_executable(cultmesh_quic_native_tests tests/cultmesh_quic_native_tests.cpp) + target_compile_features(cultmesh_quic_native_tests PRIVATE cxx_std_20) + # The header only. The scenarios drive the bridge as a host does, so they get + # no more of it than a host has. + target_link_libraries(cultmesh_quic_native_tests PRIVATE gamecult_mesh_quic_native) + set_target_properties(cultmesh_quic_native_tests PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + if(NOT WIN32) + target_link_libraries(cultmesh_quic_native_tests PRIVATE pthread) + # The linker resolves the bridge's own NEEDED libmsquic.so.2 while linking + # this executable, and the runtime copy only lands beside the binaries after + # the build; point it at the extracted package instead. + target_link_options(cultmesh_quic_native_tests PRIVATE "-Wl,-rpath-link,${MSQUIC_LIB_DIR}") + set_target_properties(cultmesh_quic_native_tests PROPERTIES + BUILD_WITH_INSTALL_RPATH TRUE + INSTALL_RPATH "$ORIGIN") + endif() +endif() diff --git a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp index b5aacb16..0466684f 100644 --- a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp +++ b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp @@ -35,6 +35,8 @@ #include #include #include +#include +#include #include #include #include @@ -46,6 +48,29 @@ #define CULTMESH_API extern "C" CULTMESH_QUIC_API +// Development builds only, and never in a shipped binary: after +// `cultmesh_quic_runtime_close` has quiesced, no host call may still be inside +// the library. The wait is what makes that true, and its absence is otherwise +// visible only as a use-after-free a sanitizer catches by luck — a poller has to +// be preempted in the right window. With pollers blocked, this states the +// invariant directly, so a build without the wait dies on the first close rather +// than on the run that happens to be unlucky. +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) +#define CULTMESH_QUIC_ASSERT_QUIESCED(count) \ + do { \ + const int cultmesh_quic_remaining = (count); \ + if (cultmesh_quic_remaining != 0) { \ + std::fprintf(stderr, \ + "cultmesh_quic_runtime_close: %d host call(s) still inside the " \ + "library after the quiesce\n", cultmesh_quic_remaining); \ + std::fflush(stderr); \ + std::abort(); \ + } \ + } while (false) +#else +#define CULTMESH_QUIC_ASSERT_QUIESCED(count) ((void)0) +#endif + namespace { constexpr uint32_t kApiVersion = 2; @@ -793,6 +818,7 @@ CULTMESH_API void cultmesh_quic_runtime_close(void* handle) { runtime->closing = true; runtime->signal.notify_all(); runtime->signal.wait(lock, [runtime] { return runtime->active_calls == 0; }); + CULTMESH_QUIC_ASSERT_QUIESCED(runtime->active_calls); for (auto& entry : runtime->streams) streams.push_back(std::move(entry.second)); for (auto& entry : runtime->connections) connections.push_back(std::move(entry.second)); for (auto& entry : runtime->listeners) listeners.push_back(std::move(entry.second)); diff --git a/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp b/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp new file mode 100644 index 00000000..1fc137a7 --- /dev/null +++ b/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp @@ -0,0 +1,151 @@ +// Scenario runner for the bridge's runtime lifetime rules. +// +// This is the one part of the bridge a host cannot check by reading: whether +// `cultmesh_quic_runtime_close` is safe against host threads that are inside the +// library when it starts. Everything here drives that path and nothing else. It +// opens a runtime, parks pollers in `cultmesh_quic_next_event`, closes the +// runtime underneath them, and asserts what the header promises: every parked +// poller returns, and none of them touches the runtime after it is gone. +// +// It consumes the bridge through include/cultmesh_quic_native.h — the same +// contract a host has — and nothing else. No MsQuic header, no internals. +// +// The failures it exists to catch are not visible in the return values, because +// a use-after-free is not an error code. Two things make them visible instead: +// a sanitizer build (ThreadSanitizer for the notify/destroy race, AddressSanitizer +// for the freed-runtime dereference), and `CULTMESH_QUIC_DEBUG_ASSERTS`, which +// makes the bridge state the quiesce invariant itself rather than leaving it to +// be caught by an unlucky thread schedule. +// +// cultmesh_quic_native_tests closerace [iterations] [pollers] +// +// Exit code 0 means every assertion held. Anything else, including a sanitizer +// abort or the bridge's own assertion, is a failure. Under ThreadSanitizer run +// it with `TSAN_OPTIONS=halt_on_error=1`, or a reported race leaves the exit +// code to the last thing that set it. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +// Long enough that a poller is still parked when the close begins. The close is +// what ends the wait; this timeout only bounds the scenario if the close never +// arrives, which is itself the failure. +constexpr int32_t kPollTimeoutMs = 5000; + +// A poller asks for a payload buffer, so the close races a `next_event` that has +// somewhere to copy into rather than one that can only ever return 0. +constexpr int32_t kPayloadCapacity = 4096; + +int Fail(const std::string& message) { + std::fprintf(stderr, "FAILED: %s\n", message.c_str()); + return 1; +} + +// One iteration: `pollers` threads parked in `next_event`, then a close under +// them. Returns an empty string when every promise held. +// +// Each poller makes exactly one blocking call and does not call again. Section 5 +// of the header puts the ordering on the host — no call may *begin* during a +// close — so a scenario that kept re-entering would be testing a shape the +// bridge declines to support, and its report would be the harness's own fault. +// A call already inside the library is the case the quiesce exists for, and that +// is the one run here. +std::string CloseRaceOnce(int pollers) { + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + + // Counts threads about to enter the blocking call. The close waits for all of + // them, so the race is run with the pollers actually inside rather than with + // threads that have not started yet. + std::atomic entering{0}; + std::atomic returned{0}; + std::atomic undefined_return{0}; + std::atomic timed_out{0}; + + std::vector threads; + threads.reserve(static_cast(pollers)); + for (int index = 0; index < pollers; ++index) { + threads.emplace_back([runtime, &entering, &returned, &undefined_return, &timed_out] { + std::vector payload(static_cast(kPayloadCapacity)); + cultmesh_quic_event event{}; + int32_t required = 0; + + entering.fetch_add(1); + const auto started = std::chrono::steady_clock::now(); + // Parked here when the close arrives. `closing` wakes the wait; the + // call scope this thread holds is what the close must count out + // before it frees anything. + const int32_t result = cultmesh_quic_next_event( + runtime, kPollTimeoutMs, &event, payload.data(), kPayloadCapacity, &required); + const auto elapsed = std::chrono::duration_cast( + std::chrono::steady_clock::now() - started).count(); + + if (result != 0 && result != 1 && result != 2) undefined_return.fetch_add(1); + // The close is what ends this wait. Sitting out the whole timeout + // instead means the wake never reached it. + if (elapsed >= kPollTimeoutMs / 2) timed_out.fetch_add(1); + returned.fetch_add(1); + }); + } + + while (entering.load() < pollers) std::this_thread::yield(); + // Settle so the pollers are inside the blocking wait rather than on their way + // to it. A poller that has not entered yet is a call beginning during the + // close, which is the host's to avoid, not the bridge's to survive. + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + cultmesh_quic_runtime_close(runtime); + for (auto& thread : threads) thread.join(); + + if (undefined_return.load() != 0) + return std::to_string(undefined_return.load()) + " poller(s) saw a return the header does not define"; + if (timed_out.load() != 0) + return std::to_string(timed_out.load()) + " of " + std::to_string(pollers) + + " pollers sat out the timeout instead of being woken by the close"; + if (returned.load() != pollers) + return std::to_string(returned.load()) + " of " + std::to_string(pollers) + " pollers returned"; + return {}; +} + +int CloseRace(int iterations, int pollers) { + for (int iteration = 0; iteration < iterations; ++iteration) { + const std::string failure = CloseRaceOnce(pollers); + if (!failure.empty()) + return Fail("closerace iteration " + std::to_string(iteration) + ": " + failure); + } + std::printf("closerace %dx%d: ok\n", iterations, pollers); + return 0; +} + +} // namespace + +int main(int argc, char** argv) { + if (argc < 2) { + std::fprintf(stderr, "usage: %s closerace [iterations] [pollers]\n", argv[0]); + return 2; + } + const std::string scenario = argv[1]; + if (scenario == "closerace") { + const int iterations = argc > 2 ? std::atoi(argv[2]) : 20; + const int pollers = argc > 3 ? std::atoi(argv[3]) : 256; + if (iterations <= 0 || pollers <= 0) { + std::fprintf(stderr, "closerace needs a positive iteration and poller count\n"); + return 2; + } + return CloseRace(iterations, pollers); + } + std::fprintf(stderr, "unknown scenario '%s'\n", scenario.c_str()); + return 2; +} From 180917d75b4acce5b0ab74b53aaa9b66c7c77c12 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 23:23:50 +0200 Subject: [PATCH 72/94] Mutate the native bridge, and name the target each entry is honest on The mutation suite covered only the TypeScript rules. The bridge's two runtime lifetime rules now have entries of their own, each with a revert that puts back the wrong spelling and a loosening that keeps the shape and gives away the guarantee: a notify moved outside the gate, a notify outside it that fires only on the last call out, the quiesce wait deleted, and the quiesce wait made bounded. Their killer is the scenario runner, built through CMake rather than npm, so the runner now takes a check per target instead of assuming a workspace, and a target without a dist/ keeps the verified restore without the sentinel. Every native entry names the platforms it is honest on, and a run elsewhere reports it as skipped rather than killed. There is no ThreadSanitizer for MSVC, so the notify rule cannot be seen on win32-x64 at all. Soul's Cut 3 pass found this the hard way, reporting two mutations killed from a win32-x64 release run where both in fact survive. Naming a target on the command line runs only that one, which is what lets the native entries run inside the Debian 13 container where the TypeScript workspaces have no installed dependencies. Co-Authored-By: Claude Opus 5 --- scripts/mutate-cultmesh.mjs | 246 ++++++++++++++++++++++++++++++++++-- 1 file changed, 234 insertions(+), 12 deletions(-) diff --git a/scripts/mutate-cultmesh.mjs b/scripts/mutate-cultmesh.mjs index d3d3f7e9..161da431 100644 --- a/scripts/mutate-cultmesh.mjs +++ b/scripts/mutate-cultmesh.mjs @@ -1,5 +1,6 @@ -// Mutation check for the CultMesh rules TypeScript owns: route verification and -// the realtime frame codec. +// Mutation check for the CultMesh rules that are not proven by reading: the +// route verifier, the realtime frame codec, and the native bridge's runtime +// lifetime. // // Two files own the route rules and each is one target here. `shared` is // `packages/cultnet-ts/src/cultmesh-authority.ts`, the one verifier, killed by @@ -24,11 +25,30 @@ // `realtime` is `packages/cultmesh-ts/src/realtime-wire.ts`, the frame codec, // killed by `npm run test --workspace packages/cultmesh-ts`. // -// node scripts/mutate-cultmesh.mjs +// `native` is `native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp`, and +// its killer is the scenario runner in that project's `tests/`, built and run +// through CMake rather than npm. It has no `dist/`, so it has no sentinel and no +// post-run rebuild check; the verified restore covers it. +// +// A mutation is only killed on a target that can see it. Some of the native +// rules are visible only under a sanitizer, and there is no ThreadSanitizer for +// MSVC; a run on the wrong platform would otherwise report "killed" for a +// mutation it never actually exercised. Every native entry therefore names the +// platforms it is honest on, and a run elsewhere reports it as `skipped`, which +// is not coverage. Soul's Cut 3 pass found this the hard way: `B1` and `L2` were +// reported killed from a win32-x64 release run where both in fact survive, and +// die deterministically only under linux-x64 AddressSanitizer. +// +// This script tests the platform it is running on. For the linux-x64 native +// entries, run it inside the Debian 13 container the bridge is built in, with +// cmake, ninja, a C++20 compiler and Node present; a Windows run reports those +// entries as skipped and says so. +// +// node scripts/mutate-cultmesh.mjs [target...] import { createHash } from "node:crypto"; import { execFileSync } from "node:child_process"; -import { existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs"; +import { existsSync, readFileSync, rmSync, unlinkSync, writeFileSync } from "node:fs"; import { dirname, join, resolve } from "node:path"; import { fileURLToPath } from "node:url"; @@ -36,6 +56,11 @@ const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const npmCli = process.env.npm_execpath ?? join(dirname(process.execPath), "node_modules", "npm", "bin", "npm-cli.js"); +// The platform this run can speak for. It is the target the native entries are +// matched against, and it is named in the output so a report cannot be read as +// covering a platform it never touched. +const platform = process.platform === "win32" ? "win32-x64" : "linux-x64"; + // Each target's `sentinel` is present in its restored source and compiled // verbatim into its dist/; that target's last mutation removes it, which is // what makes the post-rebuild check distinguish a rebuilt dist/ from one still @@ -59,6 +84,10 @@ const targets = { dist: join(repoRoot, "packages", "cultmesh-ts", "dist", "realtime-wire.js"), sentinel: "0x31545343", }, + native: { + file: join(repoRoot, "native", "GameCult.Mesh.Quic.Native", "cultmesh_quic_native.cpp"), + check: () => nativeScenariosPass(), + }, }; const mutations = [ @@ -325,6 +354,68 @@ const mutations = [ { target: "realtime", rule: "the decoded payload is a plain Uint8Array whatever the frame was", old: " payload: new Uint8Array(bytes.subarray(offset, offset + payloadLength)),", new: " payload: Uint8Array.prototype.slice.call(bytes, offset, offset + payloadLength)," }, // Last, because it removes this target's sentinel. { target: "realtime", rule: "the frame magic is 0x31545343", old: "const MAGIC = 0x31545343;", new: "const MAGIC = 0x31545344;" }, + + // The native bridge's runtime lifetime. Each rule gets two mutations: the + // revert, which puts back the spelling that was wrong, and a loosening, which + // keeps the shape and gives away the guarantee. A rule that only the revert + // kills is pinned by accident. + // + // `honestOn` is load-bearing. There is no ThreadSanitizer for MSVC, so the + // notify rule cannot be seen on win32-x64 at all; the quiesce rule is visible + // on both, but only because the assertion build states it outright. Without + // the assertion it is visible on neither in any dependable way: Soul's Cut 3 + // pass hit the use-after-free 4 times in 48 linux-x64 AddressSanitizer + // attempts with pollers blocked mid-copy of large frames, and never once on + // release. + { + target: "native", + honestOn: ["linux-x64"], + rule: "the call scope notifies under `gate` (revert: notify after the unlock)", + old: " std::lock_guard lock(runtime_->gate);\n" + + " --runtime_->active_calls;\n" + + " runtime_->signal.notify_all();\n", + new: " {\n" + + " std::lock_guard lock(runtime_->gate);\n" + + " --runtime_->active_calls;\n" + + " }\n" + + " runtime_->signal.notify_all();\n", + }, + { + target: "native", + honestOn: ["linux-x64"], + // The tempting spelling: notify only when this was the last call out, which + // looks like it narrows the window and does not close it at all. The closer's + // predicate is true the moment the count reaches zero, so this is the same + // race with a tidier face. + rule: "the call scope notifies under `gate` (loosening: notify outside it only when the count reaches zero)", + old: " std::lock_guard lock(runtime_->gate);\n" + + " --runtime_->active_calls;\n" + + " runtime_->signal.notify_all();\n", + new: " bool last = false;\n" + + " {\n" + + " std::lock_guard lock(runtime_->gate);\n" + + " last = (--runtime_->active_calls == 0);\n" + + " }\n" + + " if (last) runtime_->signal.notify_all();\n", + }, + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + rule: "the close waits for every in-flight call (revert: wake without the wait)", + old: " runtime->signal.wait(lock, [runtime] { return runtime->active_calls == 0; });\n", + new: "", + }, + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + // A bounded wait is the shape that survives review: it looks like the wait, + // it usually finishes, and it turns the contract into a hope. The assertion + // is what tells them apart. + rule: "the close waits for every in-flight call (loosening: a bounded wait that gives up)", + old: " runtime->signal.wait(lock, [runtime] { return runtime->active_calls == 0; });", + new: " runtime->signal.wait_for(lock, std::chrono::milliseconds(1),\n" + + " [runtime] { return runtime->active_calls == 0; });", + }, ]; function digest(bytes) { @@ -347,6 +438,102 @@ function testsPass(workspace) { } } +// The native killer. The bridge is a shared library, so "run the tests" is build +// the scenario runner beside it and run the scenarios. There is no npm here and +// no `dist/`; the artifacts live under artifacts/, which is git-ignored. +// +// Two configurations, because the two rules are visible to different things. The +// assertion build states the quiesce invariant outright, which is what makes the +// missing wait fail on the first close instead of on an unlucky one. The +// ThreadSanitizer build is the only thing that sees a notify land on a destroyed +// condition variable, and it exists on linux-x64 alone. +const nativeConfigurations = platform === "linux-x64" + ? [ + { name: "asserts", asserts: "ON", sanitizer: null }, + { name: "tsan", asserts: "OFF", sanitizer: "thread" }, + ] + : [{ name: "asserts", asserts: "ON", sanitizer: null }]; + +function msquicArguments() { + if (platform === "win32-x64") { + const root = join(repoRoot, "artifacts", "dependencies", "msquic-openssl-2.5.9", + "package", "build", "native"); + if (!existsSync(root)) + throw new Error(`${root} is missing; run scripts/build-quic-native.ps1 once to fetch MsQuic`); + return { + configure: [`-DMSQUIC_ROOT=${root.replace(/\\/g, "/")}`, "-A", "x64"], + runtime: [[join(root, "bin", "x64", "msquic.dll"), "msquic.dll"]], + }; + } + const cache = join(repoRoot, "artifacts", "dependencies", "msquic-linux-2.5.9"); + const libraries = join(cache, "package", "usr", "lib", "x86_64-linux-gnu"); + const versioned = join(libraries, "libmsquic.so.2.5.9"); + if (!existsSync(versioned)) + throw new Error(`${versioned} is missing; run scripts/build-quic-native.sh once to fetch MsQuic`); + // CMake links -lmsquic, which needs an unversioned name to resolve against; + // the deb ships only the versioned file. + writeFileSync(join(libraries, "libmsquic.so"), readFileSync(versioned)); + return { + configure: [ + `-DMSQUIC_INCLUDE_DIR=${join(cache, "include")}`, + `-DMSQUIC_LIB_DIR=${libraries}`, + ], + runtime: [[versioned, "libmsquic.so.2"]], + }; +} + +function nativeScenariosPass() { + const msquic = msquicArguments(); + const source = join(repoRoot, "native", "GameCult.Mesh.Quic.Native"); + for (const configuration of nativeConfigurations) { + const build = join(repoRoot, "artifacts", "quic-native-mutation", platform, configuration.name); + // From scratch each time: a stale object file would let a mutation be + // reported against a binary that does not contain it. + rmSync(build, { recursive: true, force: true }); + const flags = configuration.sanitizer + ? [`-fsanitize=${configuration.sanitizer}`, "-fno-omit-frame-pointer", "-g"].join(" ") + : ""; + // Multi-config generators (MSVC) put the binaries in a per-config directory; + // single-config ones (Ninja, Makefiles) do not. + const binaries = platform === "win32-x64" + ? join(build, "bin", "RelWithDebInfo") + : join(build, "bin"); + try { + execFileSync("cmake", [ + "-S", source, "-B", build, + "-DCMAKE_BUILD_TYPE=RelWithDebInfo", + `-DCMAKE_CXX_FLAGS=${flags}`, + `-DCMAKE_EXE_LINKER_FLAGS=${flags}`, + `-DCMAKE_SHARED_LINKER_FLAGS=${flags}`, + "-DCULTMESH_QUIC_BUILD_TESTS=ON", + `-DCULTMESH_QUIC_DEBUG_ASSERTS=${configuration.asserts}`, + ...msquic.configure, + ], { cwd: repoRoot, stdio: ["ignore", "pipe", "pipe"] }); + execFileSync("cmake", ["--build", build, "--config", "RelWithDebInfo"], + { cwd: repoRoot, stdio: ["ignore", "pipe", "pipe"] }); + } catch { + // A mutation that does not compile is killed by the build, which is a + // legitimate kill: the rule it removed was load-bearing to the language. + return false; + } + for (const [from, name] of msquic.runtime) writeFileSync(join(binaries, name), readFileSync(from)); + const runner = join(binaries, + platform === "win32-x64" ? "cultmesh_quic_native_tests.exe" : "cultmesh_quic_native_tests"); + try { + execFileSync(runner, ["closerace", "20", "256"], { + cwd: binaries, + stdio: ["ignore", "pipe", "pipe"], + // Without this a reported race is printed and the run still exits 0, + // so every sanitizer mutation would survive. + env: { ...process.env, TSAN_OPTIONS: "halt_on_error=1", ASAN_OPTIONS: "halt_on_error=1" }, + }); + } catch { + return false; + } + } + return true; +} + function occurrences(text, needle) { return text.split(needle).length - 1; } @@ -402,7 +589,17 @@ function repair(name, target, own, sidecar) { const results = []; let failed = false; +// Named targets run only those; no argument runs all of them. The native target +// is built and run inside the Debian 13 container for its linux-x64 entries, +// where the TypeScript workspaces have no installed dependencies, so being able +// to ask for one target is what makes that run possible at all. +const requested = process.argv.slice(2); +for (const name of requested) { + if (!(name in targets)) throw new Error(`unknown target '${name}'; known: ${Object.keys(targets).join(", ")}`); +} + for (const [name, target] of Object.entries(targets)) { + if (requested.length > 0 && !requested.includes(name)) continue; const own = mutations.filter(mutation => (mutation.target ?? "shared") === name); if (own.length === 0) throw new Error(`target '${name}' has no mutations`); const sidecar = `${target.file}.mutation-original`; @@ -425,18 +622,25 @@ for (const [name, target] of Object.entries(targets)) { } }; - const last = own[own.length - 1]; - if (!originalText.includes(target.sentinel) || - originalText.replace(withEol(last.old), withEol(last.new)).includes(target.sentinel)) { - throw new Error( - `the sentinel '${target.sentinel}' must be in ${target.file} and removed by its last mutation ('${last.rule}')`, - ); + // A target with a compiled `dist/` carries a sentinel so the post-run rebuild + // check can tell a rebuilt output from one still holding the last mutant. The + // native target has no dist/ and so has neither. + if (target.dist) { + const last = own[own.length - 1]; + if (!originalText.includes(target.sentinel) || + originalText.replace(withEol(last.old), withEol(last.new)).includes(target.sentinel)) { + throw new Error( + `the sentinel '${target.sentinel}' must be in ${target.file} and removed by its last mutation ('${last.rule}')`, + ); + } } + const check = target.check ?? (() => testsPass(target.workspace)); + writeFileSync(sidecar, original); try { writeFileSync(target.file, Buffer.from(originalText, "utf8")); - const controlPass = testsPass(target.workspace); + const controlPass = check(); results.push({ target: name, outcome: controlPass ? "green" : "RED", rule: "control (no-op rewrite)" }); if (!controlPass) failed = true; else { @@ -446,8 +650,20 @@ for (const [name, target] of Object.entries(targets)) { if (count !== 1) { throw new Error(`anchor for '${mutation.rule}' matched ${count} times in ${target.file}, expected exactly 1`); } + // A mutation this platform cannot see is not run. Reporting it as killed + // from a run that never exercised it is the honesty failure these marks + // exist to prevent; the anchor is still checked above, so a rule whose + // spelling has moved fails here rather than going quiet. + if (mutation.honestOn && !mutation.honestOn.includes(platform)) { + results.push({ + target: name, + outcome: "skipped", + rule: `${mutation.rule} — honest only on ${mutation.honestOn.join(", ")}, not ${platform}`, + }); + continue; + } writeFileSync(target.file, Buffer.from(originalText.replace(old, replacement), "utf8")); - const pass = testsPass(target.workspace); + const pass = check(); restore(); results.push({ target: name, outcome: pass ? "SURVIVED" : "killed", rule: mutation.rule }); if (pass) failed = true; @@ -462,6 +678,11 @@ for (const [name, target] of Object.entries(targets)) { unlinkSync(sidecar); } + if (!target.dist) { + results.push({ target: name, outcome: "restored", rule: `${target.file} sha256=${originalDigest}` }); + continue; + } + // Every test run above rebuilt dist/ from a mutant; put the restored source back in it. npm(target.workspace, "run", "build"); if (!readFileSync(target.dist, "utf8").includes(target.sentinel)) { @@ -474,5 +695,6 @@ for (const [name, target] of Object.entries(targets)) { }); } +console.log(`build host and target: ${platform}`); for (const result of results) console.log(`${result.outcome.padEnd(9)} [${result.target}] ${result.rule}`); process.exit(failed ? 1 : 0); From 51fb449b563408cbdab8cfbb7bc23e862552cbb3 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 00:02:05 +0200 Subject: [PATCH 73/94] Record the second fix batch and the harness that was never there The lifetime fix holds under a thread sanitizer and the assertion kills the deleted wait on both targets. The harness defending all of it does not hold. Every native kill this cut had reported came from scratchpads that no longer exist, the committed Linux path dies before its scenario starts and hides the reason, and the scenario stays green when calls are not counted at all or when nothing ever parks. Two rules are defended by nothing committed. They are recorded as undefended rather than given a number that would look better. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 60 ++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index 257998bc..bd0be20a 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -264,6 +264,66 @@ on Windows release and kill three times of three under AddressSanitizer, so the entries table must say which target each is honest on. A mutation whose kill depends on the target is not killed until it runs there. +**The second fix batch landed** (Opus) at `a4753f4` (the notify moves inside +the gate), `dc9e12c` (a Windows status stops sign-extending in diagnostics), +`53d5929` (the header says the return code is portably negative, not portably +meaningful), `19d8d5c` (the readme says the committed Unity plugin is the +older build), `f4186e7` (a committed scenario runner for the runtime +lifetime) and `180917d` (four native entries, each naming the target it is +honest on). + +**The discovery that outweighed the fix: there was no committed native +harness at all.** Every native mutation kill this cut had reported came from +consumers and scenarios that lived in agent scratchpads and no longer exist. +The runner at the previous head carried three package targets and nothing +touching the bridge, and two entries could not even be re-marked because +their definitions were gone. Hands built what the brief had assumed already +existed. + +**Soul's third pass, 2026-09-17** (Fable). Held: the lifetime fix on both +targets, the reverted notify killed three of three by the thread sanitizer +and invisible to the address sanitizer, so its target marking is right; the +assertion killing the deleted wait deterministically on both targets and +absent from both shipped libraries and a fresh release build; two fresh +release builds byte-identical to the committed artifact; the return-code +numbers recomputed from the pinned headers; byte-exact restore on both hosts. +**Cut 3 still does not close**, and the reason is that the harness defending +the fix is weaker than the fix: + +- **The committed Linux path does not run as committed.** The sanitizer + configuration dies before the scenario starts, on the kernel's + address-space randomisation, and the runner swallows the child's standard + error, so a future agent sees a red control and no diagnosis. Soul reached + four of four kills only by disabling randomisation and relaxing the + container's seccomp profile, neither of which any committed file mentions. + The image came from a definition that is not in the repository, and the + documented development recipe cannot run the runner at all, since it + installs the C++ toolchain but not the JavaScript runtime. High for the + claim that the Linux kills are rerunnable. +- **The scenario does not test the rule it exists for.** Deleting the call + guard from the polling entry point, so host calls are not counted at all, + survived nine runs of nine across every configuration. The harness pins the + order of the count and the notify, not that anything is counted. +- **The scenario passes vacuously when nothing parks.** Inverting the timeout + comparison makes every poller return before the close begins, and the + scenario is green on all six configurations. +- **The bounded-wait loosening is pinned by a constant, not by the rule.** At + one millisecond it dies with as few as two calls outstanding; at fifty + milliseconds it survives on both targets. A bounded wait is the wrong + contract at any bound. +- **A skipped entry exits zero** with no closing summary, so a gate reads a + host that killed nothing as green. +- **The header contradicts itself**, forbidding a call that begins after + close starts and separately promising such a poll is refused, when that + refusal path reads freed memory after teardown. + +**Two rules are defended by nothing committed**: popping before copying, and +a handle closed under a live call. Both were previously reported killed on +the sanitizer target only, and neither has a definition left. The third fix +batch is told to give each a real entry or to say plainly that the rule is +undefended, because an honest gap beats a fabricated kill. **Third fix batch +in Hands.** + **Cut 1 Soul findings, 2026-09-16.** Held: every test count, both negative greps, all twelve mutations rerun and killed, the control catching a truncated write, the equivalent mutant confirmed (Node 24 WebCrypto refuses From 62e53df447be1bf0d80b8b43308317a41ddbd408 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 00:23:04 +0200 Subject: [PATCH 74/94] Hold host calls inside the bridge so the quiesce is tested, not assumed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The closerace scenario pinned the order of the count and the notify but never that a host call is counted at all. Deleting the call scope from `cultmesh_quic_next_event` outright leaves every configuration green — the pollers finish before the teardown reaches them — and so does inverting the comparison that makes a positive timeout block, which empties the library before the close even begins. A scenario that only sleeps and hopes cannot tell any of that apart from the real thing. So the bridge says it itself, in development builds only (section 7 of the header, behind CULTMESH_QUIC_DEBUG_ASSERTS, absent from every shipped binary): the peak number of host calls counted inside the library, the number counted when the close began its wait, and a hold that parks a call inside the library until the scenario releases it. A held call returns the 0 an empty queue would have and touches the runtime no further, so a bridge that frees the runtime under it is reported by the scenario rather than crashing inside it. `holdclose` drives the quiesce through that seam: the calls are counted, they were still counted when the close began, and the close did not return while they were held. `closerace` keeps hunting the race and now also refuses to pass when a poller left before the close began, which is a scenario that raced nothing. Co-Authored-By: Claude Opus 5 --- .../GameCult.Mesh.Quic.Native/CMakeLists.txt | 6 + .../cultmesh_quic_native.cpp | 86 ++++++++++ .../include/cultmesh_quic_native.h | 32 ++++ .../tests/cultmesh_quic_native_tests.cpp | 161 ++++++++++++++++-- 4 files changed, 275 insertions(+), 10 deletions(-) diff --git a/native/GameCult.Mesh.Quic.Native/CMakeLists.txt b/native/GameCult.Mesh.Quic.Native/CMakeLists.txt index 87f877b2..41e7527f 100644 --- a/native/GameCult.Mesh.Quic.Native/CMakeLists.txt +++ b/native/GameCult.Mesh.Quic.Native/CMakeLists.txt @@ -73,6 +73,12 @@ if(CULTMESH_QUIC_BUILD_TESTS) # The header only. The scenarios drive the bridge as a host does, so they get # no more of it than a host has. target_link_libraries(cultmesh_quic_native_tests PRIVATE gamecult_mesh_quic_native) + # The scenarios see the development seam (section 7 of the header) exactly when + # the library has one, so `holdclose` compiles out of the same builds the + # bridge's own assertions compile out of. + if(CULTMESH_QUIC_DEBUG_ASSERTS) + target_compile_definitions(cultmesh_quic_native_tests PRIVATE CULTMESH_QUIC_DEBUG_ASSERTS) + endif() set_target_properties(cultmesh_quic_native_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") if(NOT WIN32) diff --git a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp index 0466684f..621be18c 100644 --- a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp +++ b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp @@ -71,6 +71,31 @@ #define CULTMESH_QUIC_ASSERT_QUIESCED(count) ((void)0) #endif +// Development builds only, and never in a shipped binary: the seam the scenario +// runner drives the quiesce through. A scenario that only sleeps and hopes its +// pollers are inside the library cannot tell a bridge that counts host calls +// from one that does not, so the bridge says so itself: +// +// - PEAK raises the high-water mark of calls counted inside, so a scenario can +// assert that the calls it launched were counted rather than assumed. +// - AT_CLOSE records how many were counted when the close began its wait, which +// is the number the wait exists for. +// - HELD parks a call inside the library until the scenario releases it, so the +// close races calls that are genuinely there for as long as the scenario +// wants them there, instead of for as long as the schedule happens to give. +// It returns true when it parked, and touches nothing afterwards: a bridge +// that frees the runtime out from under a held call is then reported by the +// scenario rather than crashing inside it. +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) +#define CULTMESH_QUIC_DEBUG_PEAK(count) DebugRaisePeak(count) +#define CULTMESH_QUIC_DEBUG_AT_CLOSE(count) DebugRecordCallsAtClose(count) +#define CULTMESH_QUIC_DEBUG_HELD(lock) DebugHoldCall(lock) +#else +#define CULTMESH_QUIC_DEBUG_PEAK(count) ((void)0) +#define CULTMESH_QUIC_DEBUG_AT_CLOSE(count) ((void)0) +#define CULTMESH_QUIC_DEBUG_HELD(lock) (false) +#endif + namespace { constexpr uint32_t kApiVersion = 2; @@ -203,6 +228,36 @@ struct Runtime { int active_calls = 0; }; +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) +// The development seam behind the three CULTMESH_QUIC_DEBUG_ macros. None of it +// is compiled into a shipped library. +std::atomic debug_peak_calls{0}; +std::atomic debug_calls_at_close{-1}; +std::mutex debug_hold_gate; +std::condition_variable debug_hold_signal; +bool debug_hold_armed = false; + +void DebugRaisePeak(int count) { + int peak = debug_peak_calls.load(std::memory_order_relaxed); + while (count > peak && !debug_peak_calls.compare_exchange_weak(peak, count)) { + } +} + +void DebugRecordCallsAtClose(int count) { debug_calls_at_close.store(count); } + +// Parks the calling host thread inside the library until the scenario releases +// it. The runtime gate is dropped first, so nothing else is blocked behind the +// held call, and it is never retaken: the call is still counted, because its +// CallScope is still alive, and that is the whole point. +bool DebugHoldCall(std::unique_lock& lock) { + std::unique_lock hold(debug_hold_gate); + if (!debug_hold_armed) return false; + lock.unlock(); + debug_hold_signal.wait(hold, [] { return !debug_hold_armed; }); + return true; +} +#endif + // Every host-facing export enters through this. It refuses once // `cultmesh_quic_runtime_close` has started, and otherwise holds the runtime // open for the length of the call. @@ -213,6 +268,7 @@ public: std::lock_guard lock(runtime_->gate); if (runtime_->closing) return; ++runtime_->active_calls; + CULTMESH_QUIC_DEBUG_PEAK(runtime_->active_calls); entered_ = true; } // The notify stays under `gate`, and that is the whole point of it. Released @@ -817,6 +873,7 @@ CULTMESH_API void cultmesh_quic_runtime_close(void* handle) { if (runtime->closing) return; runtime->closing = true; runtime->signal.notify_all(); + CULTMESH_QUIC_DEBUG_AT_CLOSE(runtime->active_calls); runtime->signal.wait(lock, [runtime] { return runtime->active_calls == 0; }); CULTMESH_QUIC_ASSERT_QUIESCED(runtime->active_calls); for (auto& entry : runtime->streams) streams.push_back(std::move(entry.second)); @@ -1117,6 +1174,10 @@ CULTMESH_API int32_t cultmesh_quic_next_event( if (runtime->events.empty() && timeout_ms > 0) { runtime->signal.wait_for(lock, std::chrono::milliseconds(timeout_ms), [runtime] { return !runtime->events.empty() || runtime->closing; }); + // Development builds only; a no-op unless a scenario has armed the hold. + // A held call returns the same 0 an empty queue would have, and touches + // the runtime no further. + if (CULTMESH_QUIC_DEBUG_HELD(lock)) return 0; } if (runtime->events.empty()) return 0; @@ -1371,3 +1432,28 @@ CULTMESH_API void cultmesh_quic_close(V1Client* client) { } #endif // _WIN32 + +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) +// The development seam's three exports. They exist only in a build configured +// with CULTMESH_QUIC_DEBUG_ASSERTS; a shipped library exports neither these nor +// the counters behind them. See section 7 of the header. +CULTMESH_API void cultmesh_quic_debug_hold_calls(int32_t hold) { + if (hold != 0) { + debug_peak_calls.store(0); + debug_calls_at_close.store(-1); + } + { + std::lock_guard lock(debug_hold_gate); + debug_hold_armed = hold != 0; + } + debug_hold_signal.notify_all(); +} + +CULTMESH_API int32_t cultmesh_quic_debug_peak_calls(void) { + return debug_peak_calls.load(); +} + +CULTMESH_API int32_t cultmesh_quic_debug_calls_at_close(void) { + return debug_calls_at_close.load(); +} +#endif diff --git a/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h b/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h index 94c8b5b7..4715e266 100644 --- a/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h +++ b/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h @@ -308,6 +308,38 @@ CULTMESH_QUIC_API int32_t cultmesh_quic_last_error( * when nothing has failed. */ CULTMESH_QUIC_API int32_t cultmesh_quic_last_status(void* runtime); +/* --------------------------------------------------------------------------- + * 7. The development seam + * + * Present only in a library configured with `CULTMESH_QUIC_DEBUG_ASSERTS`, which + * a shipped build never is. It exists for the runtime-lifetime scenarios: the + * quiesce is a promise about host calls that are inside the library, and a + * scenario that can only sleep and hope cannot tell a bridge that counts them + * from one that does not. + * + * It is process-wide, not per-runtime, because the numbers outlive the runtime + * they describe: `cultmesh_quic_runtime_close` frees the runtime, and the count + * it waited on is read afterwards. The scenarios open one runtime at a time. + * --------------------------------------------------------------------------- */ +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) + +/* Non-zero arms the hold and resets both counters: every call that reaches the + * blocking wait in `cultmesh_quic_next_event` parks inside the library instead + * of returning. Zero releases every held call and disarms it. A held call + * returns 0 and touches the runtime no further. */ +CULTMESH_QUIC_API void cultmesh_quic_debug_hold_calls(int32_t hold); + +/* The high-water mark of host calls counted inside the library since the hold + * was armed. Zero means no call was ever counted. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_debug_peak_calls(void); + +/* How many host calls were counted inside the library when the last + * `cultmesh_quic_runtime_close` began its wait, or -1 if no close has begun one + * since the hold was armed. This is the number the wait exists for. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_debug_calls_at_close(void); + +#endif /* CULTMESH_QUIC_DEBUG_ASSERTS */ + #if defined(__cplusplus) } #endif diff --git a/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp b/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp index 1fc137a7..36794d22 100644 --- a/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp +++ b/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp @@ -18,6 +18,14 @@ // be caught by an unlucky thread schedule. // // cultmesh_quic_native_tests closerace [iterations] [pollers] +// cultmesh_quic_native_tests holdclose [iterations] [pollers] +// +// `closerace` hunts the race: many pollers, many iterations, and whatever the +// schedule gives. `holdclose` takes the guessing out of it — the bridge's +// development seam (section 7 of the header) holds the pollers inside the +// library until this scenario releases them, and reports how many host calls the +// bridge actually counted, so the scenario asserts the quiesce instead of +// assuming its own fixture worked. It needs CULTMESH_QUIC_DEBUG_ASSERTS. // // Exit code 0 means every assertion held. Anything else, including a sanitizer // abort or the bridge's own assertion, is a failure. Under ThreadSanitizer run @@ -73,11 +81,18 @@ std::string CloseRaceOnce(int pollers) { std::atomic returned{0}; std::atomic undefined_return{0}; std::atomic timed_out{0}; + // Set just before the close, and read by each poller as it returns. A poller + // that is already out by then was never in the race, and a scenario full of + // those passes without testing anything: this is what catches a bridge whose + // blocking crossing has stopped blocking. + std::atomic closing_started{false}; + std::atomic left_before_the_close{0}; std::vector threads; threads.reserve(static_cast(pollers)); for (int index = 0; index < pollers; ++index) { - threads.emplace_back([runtime, &entering, &returned, &undefined_return, &timed_out] { + threads.emplace_back([runtime, &entering, &returned, &undefined_return, &timed_out, + &closing_started, &left_before_the_close] { std::vector payload(static_cast(kPayloadCapacity)); cultmesh_quic_event event{}; int32_t required = 0; @@ -96,6 +111,7 @@ std::string CloseRaceOnce(int pollers) { // The close is what ends this wait. Sitting out the whole timeout // instead means the wake never reached it. if (elapsed >= kPollTimeoutMs / 2) timed_out.fetch_add(1); + if (!closing_started.load()) left_before_the_close.fetch_add(1); returned.fetch_add(1); }); } @@ -106,9 +122,13 @@ std::string CloseRaceOnce(int pollers) { // close, which is the host's to avoid, not the bridge's to survive. std::this_thread::sleep_for(std::chrono::milliseconds(50)); + closing_started.store(true); cultmesh_quic_runtime_close(runtime); for (auto& thread : threads) thread.join(); + if (left_before_the_close.load() != 0) + return std::to_string(left_before_the_close.load()) + " of " + std::to_string(pollers) + + " pollers returned before the close began, so they were never in the race"; if (undefined_return.load() != 0) return std::to_string(undefined_return.load()) + " poller(s) saw a return the header does not define"; if (timed_out.load() != 0) @@ -119,6 +139,119 @@ std::string CloseRaceOnce(int pollers) { return {}; } +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) + +// How long a poll that does not block is given to prove it by returning, after +// the calls have been counted and before the close begins. A bridge whose +// blocking wait no longer blocks has emptied itself of host calls by the time +// the close starts, and `calls_at_close` then says 0. +constexpr int kSettleMs = 100; + +// How long the close is required to stay inside `cultmesh_quic_runtime_close` +// while the pollers are held. The held calls are what it is waiting for, and +// nothing releases them until this elapses, so a close that returns first gave +// up on a call that was still inside. This bounds what the scenario can see: a +// close that waits for longer than this and then gives up is not distinguished +// from one that waits properly, which is the honest limit of the check. +constexpr int kHeldWindowMs = 500; + +// How long the pollers are given to be counted inside the library before the +// close begins. Reaching `pollers` is the normal path; the deadline only stops +// a bridge that never counts them from hanging the scenario. +constexpr int kCountedDeadlineMs = 2000; + +// One iteration of the quiesce itself, with the guesswork taken out: the pollers +// are held inside the library by the bridge's own development seam until this +// scenario lets them go, and the bridge says how many calls it counted rather +// than the scenario assuming the schedule put them there. +// +// Three promises, and a mutation that breaks any one of them is seen here: +// - the calls are counted (`peak`), so a blocking crossing outside a call scope +// is not merely uncounted-but-lucky, it reads as zero; +// - they were still counted when the close began its wait (`calls_at_close`), +// so a poll that stopped blocking cannot leave the scenario testing an empty +// library; +// - the close did not return while they were held, so a wait that gives up +// after any interval shorter than the hold is not a wait. +std::string HoldCloseOnce(int pollers) { + cultmesh_quic_debug_hold_calls(1); + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) { + cultmesh_quic_debug_hold_calls(0); + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + } + + std::atomic returned{0}; + std::atomic undefined_return{0}; + std::vector threads; + threads.reserve(static_cast(pollers)); + for (int index = 0; index < pollers; ++index) { + threads.emplace_back([runtime, &returned, &undefined_return] { + std::vector payload(static_cast(kPayloadCapacity)); + cultmesh_quic_event event{}; + int32_t required = 0; + const int32_t result = cultmesh_quic_next_event( + runtime, kPollTimeoutMs, &event, payload.data(), kPayloadCapacity, &required); + if (result != 0 && result != 1 && result != 2) undefined_return.fetch_add(1); + returned.fetch_add(1); + }); + } + + const auto counted_deadline = + std::chrono::steady_clock::now() + std::chrono::milliseconds(kCountedDeadlineMs); + while (cultmesh_quic_debug_peak_calls() < pollers && + std::chrono::steady_clock::now() < counted_deadline) + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + std::this_thread::sleep_for(std::chrono::milliseconds(kSettleMs)); + + std::atomic closed{false}; + std::thread closer([runtime, &closed] { + cultmesh_quic_runtime_close(runtime); + closed.store(true); + }); + const auto held_until = + std::chrono::steady_clock::now() + std::chrono::milliseconds(kHeldWindowMs); + while (!closed.load() && std::chrono::steady_clock::now() < held_until) + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + + const bool closed_while_held = closed.load(); + const int32_t peak = cultmesh_quic_debug_peak_calls(); + const int32_t at_close = cultmesh_quic_debug_calls_at_close(); + + cultmesh_quic_debug_hold_calls(0); + closer.join(); + for (auto& thread : threads) thread.join(); + + if (peak != pollers) + return "the library counted a peak of " + std::to_string(peak) + " host call(s) inside it, not " + + std::to_string(pollers) + "; the blocking crossing is not inside a call scope"; + if (at_close != pollers) + return "the close began its wait with " + std::to_string(at_close) + + " host call(s) counted inside, not " + std::to_string(pollers) + + "; the pollers were not inside the library when the close started"; + if (closed_while_held) + return "the close returned while " + std::to_string(pollers) + + " host call(s) were still held inside the library"; + if (undefined_return.load() != 0) + return std::to_string(undefined_return.load()) + " poller(s) saw a return the header does not define"; + if (returned.load() != pollers) + return std::to_string(returned.load()) + " of " + std::to_string(pollers) + " pollers returned"; + return {}; +} + +int HoldClose(int iterations, int pollers) { + for (int iteration = 0; iteration < iterations; ++iteration) { + const std::string failure = HoldCloseOnce(pollers); + if (!failure.empty()) + return Fail("holdclose iteration " + std::to_string(iteration) + ": " + failure); + } + std::printf("holdclose %dx%d: ok\n", iterations, pollers); + return 0; +} + +#endif // CULTMESH_QUIC_DEBUG_ASSERTS + int CloseRace(int iterations, int pollers) { for (int iteration = 0; iteration < iterations; ++iteration) { const std::string failure = CloseRaceOnce(pollers); @@ -133,18 +266,26 @@ int CloseRace(int iterations, int pollers) { int main(int argc, char** argv) { if (argc < 2) { - std::fprintf(stderr, "usage: %s closerace [iterations] [pollers]\n", argv[0]); + std::fprintf(stderr, "usage: %s closerace|holdclose [iterations] [pollers]\n", argv[0]); return 2; } const std::string scenario = argv[1]; - if (scenario == "closerace") { - const int iterations = argc > 2 ? std::atoi(argv[2]) : 20; - const int pollers = argc > 3 ? std::atoi(argv[3]) : 256; - if (iterations <= 0 || pollers <= 0) { - std::fprintf(stderr, "closerace needs a positive iteration and poller count\n"); - return 2; - } - return CloseRace(iterations, pollers); + const int iterations = argc > 2 ? std::atoi(argv[2]) : 20; + const int pollers = argc > 3 ? std::atoi(argv[3]) : 256; + if (iterations <= 0 || pollers <= 0) { + std::fprintf(stderr, "%s needs a positive iteration and poller count\n", scenario.c_str()); + return 2; + } + if (scenario == "closerace") return CloseRace(iterations, pollers); + if (scenario == "holdclose") { +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) + return HoldClose(iterations, pollers); +#else + std::fprintf(stderr, + "holdclose needs the development seam: configure with " + "-DCULTMESH_QUIC_DEBUG_ASSERTS=ON\n"); + return 2; +#endif } std::fprintf(stderr, "unknown scenario '%s'\n", scenario.c_str()); return 2; From e4e09a086c3ad128db28921a9abd67bd55539b1d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 00:24:21 +0200 Subject: [PATCH 75/94] Enter the rules the quiesce rests on, and stop exiting green on skips MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Four entries the native target did not have. Two for the rule that a blocking crossing is a counted host call: the revert deletes the call scope from `cultmesh_quic_next_event`, and the loosening keeps the scope and its refusal but drops it at the door, before the call blocks. Two for the rule that a positive timeout blocks until an event or the close: the revert inverts the comparison, and the loosening waits a token millisecond. All four were green before this, because nothing checked that the pollers were inside the library at all. The bounded-wait loosening goes from 1 ms to 50 ms. A 1 ms bound only ever lost a race — the margin was a few hundred lock handoffs — and the same loosening at 50 ms survived on both targets. `holdclose` holds its pollers for 500 ms, so any bound shorter than the hold now expires with calls still inside. A bound longer than the hold is not distinguished, which is this entry's honest limit. A run that skips entries covered those rules with nothing, and exiting 0 let a win32-x64 run — where every ThreadSanitizer rule is skipped — be read as a green gate. It exits 2 and says so, with a killed/survived/skipped line. A red control arrived as a bare colour with the child's output thrown away, which is how a configuration that could not start at all stayed invisible. The control now prints what the child said. On linux-x64 the sanitizer configurations are re-executed through `setarch -R`, because ThreadSanitizer dies before `main` on the kernel's address-space randomisation; both that and the seccomp denial behind `personality(ADDR_NO_RANDOMIZE)` stop the run with the cause and the required invocation instead of being reported as kills. Co-Authored-By: Claude Opus 5 --- scripts/mutate-cultmesh.mjs | 196 ++++++++++++++++++++++++++++++++---- 1 file changed, 177 insertions(+), 19 deletions(-) diff --git a/scripts/mutate-cultmesh.mjs b/scripts/mutate-cultmesh.mjs index 161da431..c8cced18 100644 --- a/scripts/mutate-cultmesh.mjs +++ b/scripts/mutate-cultmesh.mjs @@ -398,6 +398,57 @@ const mutations = [ " }\n" + " if (last) runtime_->signal.notify_all();\n", }, + // The rule the quiesce rests on, and the one the scenario used to assume + // rather than test: the blocking crossing is a counted host call for as long + // as it is inside the library. Soul deleted the scope from `next_event` + // outright and every configuration stayed green, because the pollers finished + // before the teardown reached them. `holdclose` reads the bridge's own count + // instead. + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + rule: "the blocking crossing is a counted call (revert: no call scope on next_event)", + old: " CallScope scope(runtime);\n" + + " if (!scope.entered()) return -1;\n" + + " *out_required = 0;\n", + new: " *out_required = 0;\n", + }, + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + // The shape that passes review: the guard is there, it refuses during a + // close, it is simply let go before the call blocks. What the closer waits + // on is the count, and this hands it back at the door. + rule: "the blocking crossing is a counted call (loosening: the scope is dropped before the wait)", + old: " CallScope scope(runtime);\n" + + " if (!scope.entered()) return -1;\n" + + " *out_required = 0;\n", + new: " {\n" + + " CallScope scope(runtime);\n" + + " if (!scope.entered()) return -1;\n" + + " }\n" + + " *out_required = 0;\n", + }, + // And the fixture's own premise, which is a rule of the bridge and not of the + // scenario: a positive timeout blocks. Soul inverted this comparison and the + // scenario stayed green on six configurations, because nothing checked that + // the pollers were inside the library when the close began. + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + rule: "a positive timeout blocks until an event or the close (revert: it returns at once)", + old: " if (runtime->events.empty() && timeout_ms > 0) {", + new: " if (runtime->events.empty() && timeout_ms < 0) {", + }, + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + // Still a wait, still the host's timeout in the signature, and the poller is + // gone a millisecond later. A scenario that only sleeps cannot tell. + rule: "a positive timeout blocks until an event or the close (loosening: it waits a token 1 ms)", + old: "std::chrono::milliseconds(timeout_ms),", + new: "std::chrono::milliseconds(1),", + }, { target: "native", honestOn: ["linux-x64", "win32-x64"], @@ -409,11 +460,17 @@ const mutations = [ target: "native", honestOn: ["linux-x64", "win32-x64"], // A bounded wait is the shape that survives review: it looks like the wait, - // it usually finishes, and it turns the contract into a hope. The assertion - // is what tells them apart. + // it usually finishes, and it turns the contract into a hope. The bound is + // 50 ms, not the 1 ms this entry used to carry, because 1 ms only ever lost + // a race — Soul measured the margin at a few hundred lock handoffs, and the + // same loosening at 50 ms survived on both targets. `holdclose` holds its + // pollers for 500 ms, so the bound no longer has to be unlucky: any bound + // shorter than the hold expires with calls still inside and the bridge's own + // assertion says so. A bound longer than the hold is not distinguished, and + // that is the honest limit of this entry. rule: "the close waits for every in-flight call (loosening: a bounded wait that gives up)", old: " runtime->signal.wait(lock, [runtime] { return runtime->active_calls == 0; });", - new: " runtime->signal.wait_for(lock, std::chrono::milliseconds(1),\n" + + new: " runtime->signal.wait_for(lock, std::chrono::milliseconds(50),\n" + " [runtime] { return runtime->active_calls == 0; });", }, ]; @@ -447,12 +504,31 @@ function testsPass(workspace) { // missing wait fail on the first close instead of on an unlucky one. The // ThreadSanitizer build is the only thing that sees a notify land on a destroyed // condition variable, and it exists on linux-x64 alone. +// +// `holdclose` runs only where the development seam exists, which is the +// assertion build: it drives the quiesce through that seam rather than through a +// sleep, and it is what kills the rules about counting a host call at all. The +// ThreadSanitizer build deliberately keeps the shipped shape — no assertions, no +// seam — because what it is there for is the race in a library built like the +// one that ships. const nativeConfigurations = platform === "linux-x64" ? [ - { name: "asserts", asserts: "ON", sanitizer: null }, - { name: "tsan", asserts: "OFF", sanitizer: "thread" }, + { + name: "asserts", + asserts: "ON", + sanitizer: null, + scenarios: [["holdclose", "3", "64"], ["closerace", "20", "256"]], + }, + { name: "tsan", asserts: "OFF", sanitizer: "thread", scenarios: [["closerace", "20", "256"]] }, ] - : [{ name: "asserts", asserts: "ON", sanitizer: null }]; + : [ + { + name: "asserts", + asserts: "ON", + sanitizer: null, + scenarios: [["holdclose", "3", "64"], ["closerace", "20", "256"]], + }, + ]; function msquicArguments() { if (platform === "win32-x64") { @@ -482,6 +558,54 @@ function msquicArguments() { }; } +// What the last failed native check actually said. A red control used to arrive +// as a bare RED line with the child's output thrown away, which is how a +// configuration that could not start at all stayed invisible; this is printed +// with it. +let nativeFailure = null; + +function childOutput(error) { + const parts = [error.stderr, error.stdout] + .map(stream => (stream ? stream.toString("utf8").trimEnd() : "")) + .filter(text => text.length > 0); + return parts.length > 0 ? parts.join("\n") : `${error.message}`; +} + +// A sanitizer needs the process's address space where it expects it. Under the +// kernel's address-space randomisation a ThreadSanitizer process dies before +// main with "unexpected memory mapping", which is not a mutation being killed — +// it is every mutation being reported killed for a run that never started. So +// the sanitizer configurations are re-executed with randomisation off rather +// than left to whoever invokes this script to know. +// +// `setarch -R` asks for that through personality(ADDR_NO_RANDOMIZE), which +// Docker's default seccomp profile denies. Both failures are named here rather +// than swallowed. +function scenarioCommand(runner, scenario, configuration) { + if (configuration.sanitizer && platform === "linux-x64") + return ["setarch", ["-R", runner, ...scenario]]; + return [runner, scenario]; +} + +function explainUnrunnable(error, configuration, runner, scenario) { + const output = childOutput(error); + const invocation = `setarch -R ${runner} ${scenario.join(" ")}`; + if (error.code === "ENOENT") + return `the ${configuration.name} configuration needs setarch (util-linux) to disable address-space ` + + `randomisation, and it is not on PATH.\n Required invocation: ${invocation}`; + if (/failed to set personality|Operation not permitted/.test(output)) + return `setarch could not disable address-space randomisation for the ${configuration.name} ` + + "configuration: personality(ADDR_NO_RANDOMIZE) was denied.\n" + + " Docker's default seccomp profile denies it; run the container with --security-opt seccomp=unconfined.\n" + + ` Required invocation: ${invocation}\n ${output}`; + if (/unexpected memory mapping/.test(output)) + return `the ${configuration.name} sanitizer died before the scenario started, on the kernel's ` + + "address-space randomisation.\n" + + ` Required invocation: ${invocation}, in a container run with --security-opt seccomp=unconfined.\n` + + ` ${output}`; + return null; +} + function nativeScenariosPass() { const msquic = msquicArguments(); const source = join(repoRoot, "native", "GameCult.Mesh.Quic.Native"); @@ -511,24 +635,37 @@ function nativeScenariosPass() { ], { cwd: repoRoot, stdio: ["ignore", "pipe", "pipe"] }); execFileSync("cmake", ["--build", build, "--config", "RelWithDebInfo"], { cwd: repoRoot, stdio: ["ignore", "pipe", "pipe"] }); - } catch { + } catch (error) { // A mutation that does not compile is killed by the build, which is a // legitimate kill: the rule it removed was load-bearing to the language. + nativeFailure = `${configuration.name}: the build failed\n${childOutput(error)}`; return false; } for (const [from, name] of msquic.runtime) writeFileSync(join(binaries, name), readFileSync(from)); const runner = join(binaries, platform === "win32-x64" ? "cultmesh_quic_native_tests.exe" : "cultmesh_quic_native_tests"); - try { - execFileSync(runner, ["closerace", "20", "256"], { - cwd: binaries, - stdio: ["ignore", "pipe", "pipe"], - // Without this a reported race is printed and the run still exits 0, - // so every sanitizer mutation would survive. - env: { ...process.env, TSAN_OPTIONS: "halt_on_error=1", ASAN_OPTIONS: "halt_on_error=1" }, - }); - } catch { - return false; + for (const scenario of configuration.scenarios) { + const [command, commandArguments] = scenarioCommand(runner, scenario, configuration); + try { + execFileSync(command, commandArguments, { + cwd: binaries, + stdio: ["ignore", "pipe", "pipe"], + // A held poller plus a stopped close is the shape a broken mutant + // leaves behind, and it hangs rather than failing. Bounded well above + // the scenarios' own seconds so only a hang reaches it. + timeout: 180000, + // Without this a reported race is printed and the run still exits 0, + // so every sanitizer mutation would survive. + env: { ...process.env, TSAN_OPTIONS: "halt_on_error=1", ASAN_OPTIONS: "halt_on_error=1" }, + }); + } catch (error) { + // A scenario the environment cannot run is not a kill, and reporting it + // as one is how a whole configuration goes quiet. It stops the run. + const unrunnable = explainUnrunnable(error, configuration, runner, scenario); + if (unrunnable) throw new Error(unrunnable); + nativeFailure = `${configuration.name}: ${scenario.join(" ")}\n${childOutput(error)}`; + return false; + } } } return true; @@ -640,9 +777,17 @@ for (const [name, target] of Object.entries(targets)) { writeFileSync(sidecar, original); try { writeFileSync(target.file, Buffer.from(originalText, "utf8")); + nativeFailure = null; const controlPass = check(); results.push({ target: name, outcome: controlPass ? "green" : "RED", rule: "control (no-op rewrite)" }); - if (!controlPass) failed = true; + // A red control is the harness failing, not a rule failing, and it used to + // arrive with nothing but the colour. Whatever the child said is the + // diagnosis, so it is printed where it happens rather than discarded. + if (!controlPass) { + failed = true; + console.error(`control RED [${name}]: the unmutated source does not pass its own check`); + if (nativeFailure) console.error(nativeFailure); + } else { for (const mutation of own) { const [old, replacement] = [withEol(mutation.old), withEol(mutation.new)]; @@ -697,4 +842,17 @@ for (const [name, target] of Object.entries(targets)) { console.log(`build host and target: ${platform}`); for (const result of results) console.log(`${result.outcome.padEnd(9)} [${result.target}] ${result.rule}`); -process.exit(failed ? 1 : 0); + +// A run that skipped entries has not covered those rules, and exiting 0 lets a +// gate read a win32-x64 run — where every ThreadSanitizer rule is skipped — as +// proof of something it never touched. The status says which of the three +// outcomes the run reached. +const counted = outcome => results.filter(result => result.outcome === outcome).length; +const [killed, survived, skipped] = [counted("killed"), counted("SURVIVED"), counted("skipped")]; +console.log(`${killed} killed, ${survived} survived, ${skipped} skipped on ${platform}`); +if (skipped > 0) { + console.log( + `${skipped} rule(s) have no kill on ${platform} and were not exercised by this run; ` + + "run the native target on the platform each names to cover them."); +} +process.exit(failed ? 1 : (skipped > 0 ? 2 : 0)); From 12c8bfcc7d33e8f39afe845bc47f53414d0be5f9 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 00:25:59 +0200 Subject: [PATCH 76/94] Let the prohibition on a late call stand on its own MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Section 4 forbade any host call that begins after `cultmesh_quic_runtime_close` starts, and promised in the same sentence that such a call is refused with -1; section 6 repeated the promise for `cultmesh_quic_next_event`. The refusal lives behind the runtime's own gate, so once the close has returned there is nothing left to read it: the case the sentence describes is exactly the case where the promise cannot hold. The prohibition stands alone. The refusal is stated for what it is — a call that races the start of a close, while the close is still running, is refused and touches nothing — and no longer as a guarantee covering the call the section forbids. Co-Authored-By: Claude Opus 5 --- .../include/cultmesh_quic_native.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h b/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h index 4715e266..bf30d7eb 100644 --- a/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h +++ b/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h @@ -198,10 +198,12 @@ enum cultmesh_quic_stream_kind { * `cultmesh_quic_runtime_close` quiesces before it tears anything down. It marks * the runtime closing, wakes every blocked `cultmesh_quic_next_event`, and waits * for every in-flight export to return before it closes a handle or frees a - * byte. No host call may begin after `cultmesh_quic_runtime_close` starts: a - * call that arrives during or after it is refused with -1 and touches nothing. - * The host is responsible for that ordering; the refusal is a guard rail, not a - * licence to race. + * byte. No host call may begin after `cultmesh_quic_runtime_close` starts. That + * ordering is the host's, and it is a prohibition rather than a race the bridge + * arbitrates: once the close returns, the handle names freed memory, and a call + * made with it has nothing left to refuse it. A call that races the start of the + * close, while it is still running, is refused with -1 and touches nothing; that + * narrows one mis-ordering and does not make the prohibition optional. * --------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------- @@ -280,8 +282,9 @@ CULTMESH_QUIC_API void cultmesh_quic_stream_shutdown( /* The one blocking crossing. * * 0 nothing within `timeout_ms`. A poller already blocked here when - * `cultmesh_quic_runtime_close` starts is woken and returns 0; one that - * arrives after it starts is refused with -1 like any other call. + * `cultmesh_quic_runtime_close` starts is woken and returns 0. A poll that + * begins after the close starts is forbidden by section 4, and is not a + * case this return code covers. * 1 `*out_event` filled and up to `payload_capacity` payload bytes copied; * `*out_required` is the payload size * 2 `payload_capacity` is too small. Nothing is consumed and nothing is From c2c07605d8dc9014c378572b7264245ea0ef2c43 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 00:36:44 +0200 Subject: [PATCH 77/94] Map the selection cut for CultNet's database organ Three selector engines evaluate the same two allowlists today, two of them carrying identical copies of the same reflection, and projection is a delegate no production code ever constructs. The map replaces all of it with one selection a caller can state: any-of over the aliases the cache already declares, a projection it asks for, an order, a cursor, and one hop along a declared reference. The audit is reported as measured rather than as hoped. About 326 of 21,720 lines collapse in CultMesh, and the repository grows by about 370, because the Rust runtime gains a capability it never had. Co-Authored-By: Claude Fable 5.1 --- docs/cultnet-selection-cut.md | 751 ++++++++++++++++++++++++++++++++++ 1 file changed, 751 insertions(+) create mode 100644 docs/cultnet-selection-cut.md diff --git a/docs/cultnet-selection-cut.md b/docs/cultnet-selection-cut.md new file mode 100644 index 00000000..de2f9045 --- /dev/null +++ b/docs/cultnet-selection-cut.md @@ -0,0 +1,751 @@ +# CultNet typed selection: cut map + +Date: 2026-09-17. Imagination output. Intended path: `F:\Projects\CultLib\docs\cultnet-selection-cut.md`. +No code in this document has been written; nothing here is committed by +Imagination. This is its own campaign with its own map; it does not touch +`docs/typescript-quic-realtime-cut.md` or any code in that tree. + +Status: cut map for one cut, **Cut 1: the selection vocabulary in the C# +reference runtime and the Rust runtime**, with the follow-on runtime cuts +and the Huginn consumer cut named and not mapped. + +**Rulings this map is written under (operator, 2026-09-17):** + +- The vocabulary lands in CultLib at the CultNet layer, not in Huginn. It + fills a hole: the query side of the substrate was never dropped by + decision, only never asked for. `contracts/cultnet/cultnet-distributed-database.md:10-11` + names RethinkDB changefeeds with "point, table/schema, and **filtered + watches**" as prior art to keep; schema and key allowlists were built, + filtered selection never was. +- The first cut covers the C# reference (`src\GameCult.Networking`) and + Rust (`packages\cultnet-rs`, what Huginn consumes). TypeScript, Python and + Kotlin follow when they have a caller. +- Deletes first: the two untyped stand-ins are replaced, not sat beside. +- The CultMesh subtraction audit is a required part of the map, with real + line counts, and an honest miss beats a padded ledger. +- Nothing on the wire is serde-untagged (rule of this cut; evidence below). + +**What survives unchanged from the Huginn-targeted specification** +(`scratchpad/cut10b-read-side-spec.md`, D1-D4): the five capabilities, the +chosen representation and the rejected ones with their reasons, the order and +snapshot cursor, the role-typed hop, the one negation, and the bound. What +changes: owner, repo, the value model of a field predicate (strings, because +the cache's indexes are strings), the parity obligation, and the subtraction. + +## Pins + +| Repo | Branch | HEAD | State | +|---|---|---|---| +| CultLib | `main` | `51fb449` | dirty in `native/GameCult.Mesh.Quic.Native/*` and `scripts/mutate-cultmesh.mjs` from the live QUIC campaign; **not touched**. Every `file:line` below is against `51fb449`. | +| Huginn | `eureka/memory-organ` | `25a841d` | the consumer; its cut is named in section 12 and mapped in the Epiphany campaign map. | +| Epiphany leaf | `5cda0886` | — | untouched. | + +Baselines: `src/GameCult.Networking` 14,848 lines; `src/GameCult.Mesh` +21,720 lines; `tests/GameCult.Networking.Tests/NetworkingTests.cs` 141 +`[Test]`s; `packages/cultnet-rs` 111 `#[test]`s; `cultnet-rs` depends on +`serde`, `rmp-serde 1.3`, `rmpv`, `serde_json`, `cultcache-rs` and no +`schemars` (`packages/cultnet-rs/Cargo.toml:14-31`). + +## 1. Body facts, each by source read + +**The reference's read side today.** + +- `CultNetDatabase` (`src/GameCult.Networking/CultNetDatabase.cs`): change + kinds `:15-45`; `Watch` `:1052`, `WatchAllChanges` `:1063`, + `WatchRecord` `:1072`; `GetAll` `:776`; per-shard mutation log with + sequence (`:465-466`, `:528-590`, `:631` a snapshot carries + `ShardLogSequence`). `CultNetSchemaAliasMatching` `:47-97` is the one + schema-alias matcher, `internal static`. +- **Three separate selector engines evaluate the same two allowlists:** + `CultNetDocumentRegistry.CreateRawSnapshotResponse` `:263-349` (snapshot, + over `cache.AllEntries` by reflection at `:325-342`) with its own + `MatchesRequestedSchema` `:505-524`; `CultNetDatabaseServer.CreateChangeMessage` + `:347-384` with `Matches`/`MatchesSchema`/`InferSchemaName` `:401-468` + (the LiteNetLib path, the one production construction site, + `CultNetLocal.cs:154`); `CultNetDatabaseSubscriptionServer.CreateChangeCore` + `:442-485` with `MatchesRequestedSchema` `:493-500` (the RUDP path). Two + of them carry an identical reflection copy of `CreateRawRecord` + (`CultNetDatabaseServer.cs:386-399`, `CultNetDatabaseSubscriptionServer.cs:502-515`). +- **The two stand-ins.** `CultNetDatabaseSubscribeMessage` + (`CultNetSchemaMessages.cs:788-826`): `schemaIds` `:805`, `recordKeys` + `:809`, `includeSnapshot` `:813`, then `consumerRuntimeId`, `bodyIds`, + `supportedBodyTransports` (body-plane demand, not selection). The same + pair on `CultNetSnapshotRequestMessage` `:737-741`, + `CultNetShardCatalogRequestMessage` `:949-953` (shard routing, stays), and + `CultNetSchemaCatalogRequestMessage` `:1591` (catalog, stays). + `_projectRecord` on the subscription server (`:27`, `:44`, `:50`, + `:239-240`, `:314`): **no production caller constructs the subscription + server at all** — `grep "new CultNetDatabaseSubscriptionServer"` over + `src/` is empty; it is built only in tests (`NetworkingTests.cs:1596-1605` + passes `projectRecord`). Projection is authority that exists in the + reference and reaches no wire and no caller. +- **The cache already owns addressing.** `CultIndexAttribute` + (`src/GameCult.Caching/CultDocumentContracts.cs:34`, `Alias` `:41`) names + a member as an index; the cache's index values are **strings by + construction** (`CultCache.cs:1084` `Getter = document => getValue(document)?.ToString()`; + `GetByIndex(string alias, string value)` `:1503-1509`). + `CultReferenceAttribute` (`:45`, `TargetType` `:53`, `Many` `:55`) names a + member as a reference; the descriptor records `IsReference`, `IsMany`, + `TargetSchemaName` (`CultCache.cs:1069-1080`). So a field predicate's key + is an index alias and a hop's role is a reference member, both declared + by the document's owner and both readable from `CultDocumentDescriptor`. + No cache change is needed for addressing. +- **Schemas are hand-written JSON** in `contracts/cultnet/*.schema.json`, + listed by file name in `CultNetSchemaRegistry.cs:360-385`; TypeScript + compiles them with Ajv and refuses unknown fields + (`cultnet.database-subscribe.schema.json` has `additionalProperties: false`); + Python lists required fields per version by hand + (`packages/cultnet-py/src/cultnet_py/schema_catalog.py:283`, `:407`); Rust + types are a serde enum tagged on `schemaVersion` + (`packages/cultnet-rs/src/contracts.rs:252`) with hand validation + (`require_optional_string_vec`, `:548-594`). C# encodes with + MessagePack-CSharp string keys (`[Key("name")]`), i.e. named maps; Rust + encodes with `rmp_serde::to_vec_named`. +- **Runtime coverage of the subscribe message today.** C# server ×2, C# + client (`CultNetDatabaseSubscriptionClient.cs:138-151`); TypeScript + contract only (`packages/cultnet-ts/src/contracts.ts:237-247`, no server + fanout, interop tests send it at `test/interop/cultnet-interop.test.ts:719,798`); + Python server ×2 (`cultnet_py/interop_peer.py:390-401` with + `DatabaseSubscription.matches` `:110-125`, and + `cultmesh_py/server.py:315-331` with `_subscription_matches_document` + `:449-470`, `_schema_matches_request` `:699-716`, and a third copy in + `cultmesh_py/node.py:1322-1345`); **Rust: none** — `cultnet-rs` has + `SnapshotRequest` with the two allowlists (`contracts.rs:314-321`) and no + `DatabaseSubscribe` variant; Kotlin: none (a snapshot-request builder, + `CultMesh.kt:2111`, and a `require(schemaVersion == "…snapshot_request.v0")` + at `:2195`). +- **How each runtime treats a message it does not know**, which is the + wire-parity fact section 9 rests on: C# throws + (`CultNetSchemaMessageSerialization.cs:85` `_ => throw`); TypeScript + `parseCultNetMessage` (`contracts.ts:728-744`) looks the version up in its + Ajv validators and throws when absent; Kotlin `require`s the exact version + (`CultMesh.kt:2195-2196`); Rust's tagged enum fails to deserialize on an + unknown tag; **Python returns `[]`** (`interop_peer.py:360-387` falls off + the chain; `cultmesh_py/server.py:341` delegates to `handle_message`) — a + silent drop, no reply, and for a *known* version with unknown fields + Python reads only the fields it expects (`message.get(...)`), so it would + answer a selector it did not understand with the wrong rows. +- **Every committed write has a shard-log sequence** — assumed from + `CultNetDatabase.cs:465` (`_nextLogSequences`) and the invariant "raw + snapshot/put/delete messages must pass through `CultNetDatabase`" + (`cultnet-distributed-database.md:115-116`); **Hands confirms** that a + local `PutAsync` outside any shard also takes a sequence, because the + order in section 3 rests on it. If it does not, the row's ordinal is its + `storedAt` and the cursor refuses on any advance (section 3 says what + that costs). + +**The CultMesh audit** (Explore pass over `src/GameCult.Mesh` and +`CultNetDocumentRegistry.cs`, 92 sites classified) is in section 11 with its +numbers. + +## 2. The vocabulary, exactly + +One shape, `cultnet.selection.v1`, carried by two request messages at a new +version and answered by one page message. Field names are the wire +spelling; C# and Rust type names follow each runtime's convention. + +``` +Selection { + schemas: string[]? // kinds: schema ids or aliases, matched by CultNetSchemaAliasMatching; absent = every schema + keys: string[]? // record-key allowlist; absent = every key + fields: FieldPredicate[]? // conjunction; each is any-of over one declared index alias + cites: Citation? // rows whose declared reference `role` (or any reference) names `target` + cited: Incoming? // rows that some row does / does not name in `role` + projection: "header" | "document" // default "header" + descending: bool // default false; the one order, reversed + limit: uint32? // clamped 1..=200 + cursor: string? // opaque; minted by the answering server +} +FieldPredicate { index: string, anyOf: string[] } // anyOf non-empty; index must be declared on some schema the selection can reach, else refused +Citation { target: RecordRef, role: string? } // target validated as a reference the row owner recognises +Incoming { role: string, exists: bool } +RecordRef { schemaId: string, recordKey: string } + +SelectionPage { // cultnet.snapshot_response_raw.v1 carries this + matched: uint32 + asOf: uint64 // the snapshot the page is exact for + next: string? // absent on the last page + headers: RawDocumentHeader[]? | documents: RawDocumentRecord[]? // exactly one present, by projection + shardId?, shardEpoch?, shardLogSequence? // as v0 carries them +} +RawDocumentHeader = RawDocumentRecord minus payload, payloadEncoding +``` + +Messages: `cultnet.snapshot_request.v1 { messageId, selection, shardId?, shardEpoch? }`; +`cultnet.database_subscribe.v1 { messageId, subscriptionId, selection, includeSnapshot, consumerRuntimeId?, bodyIds?, supportedBodyTransports? }`; +`cultnet.snapshot_response_raw.v1` as above. `database_change_raw.v0` and +`database_unsubscribe.v0` are unchanged: a change is a change. + +**Rules, each one owner:** + +- **Order** is `(ordinal, schemaId, recordKey)` ascending, or the reverse + under `descending`. `ordinal` is the sequence of the commit that last + wrote the row (the shard-log sequence in the reference; the receipt + sequence in Huginn). The row owner supplies it; the vocabulary never reads + a clock. +- **Snapshot.** A page is exact as of `asOf`. A cursor carries `asOf`, the + last `(ordinal, schemaId, recordKey)`, and a digest of the selection with + `cursor` and `limit` cleared. A server that can present rows as of the + cursor's `asOf` answers the next page over that snapshot; **a server that + cannot refuses** `cultnet.error.v0 { code: "cursor_stale", details: { asOf, current } }`. + The reference refuses when the shard log has advanced (rows mutate, and a + replay is not this cut's); Huginn never refuses (append-only, one + writer). One contract, two honest servers. A cursor that does not decode, + or whose digest is not this selection's, is `cursor_invalid`. +- **Fields** are any-of over string values of one declared index, conjoined + across predicates. A row of a schema that does not declare the index + never matches it. An `index` no reachable schema declares, an empty + `anyOf`, an empty `keys` or `schemas` list, and a `role` no schema + declares are refused typed at the door (`selection_invalid { field, value }`), + never answered as an empty page. Values are strings because the cache's + indexes are strings (`CultCache.cs:1084`); an enum-typed field on the + consumer's side is a string on the wire and the row owner refuses a value + its enum does not carry — the closed key set survives as "declared + aliases only", and the fixed operator survives as any-of. +- **The hop** reads edges the row owner declares: in the reference, members + with `CultReferenceAttribute` (role = the member's index alias or name; + target = the referenced key, or each key when `Many`); in Rust, the + `Row::references` the consumer implements. The citer's status, fields and + authorization are not consulted by the hop; one hop, no second. +- **Projection.** `header` is the record without its payload; `document` is + the record. The consumer decides what a header *means* for typed rows + (Huginn's typed summary is its header; the substrate carries whichever + type the page was instantiated with). +- **Not on the wire:** the admission window (`admittedAfter/Before`) of + Huginn's Cut 9 — `descending` plus the cursor answer "the latest"; a date + window is a range, and ranges are out (Q-G). + +**The bound, carried forward in force.** Closed key set (declared aliases), +fixed operator (any-of), no path language, no expression terms, no OR, one +negation, one hop, no depth field, no sort field, no range, no text. +Section 13 lists what is deliberately impossible. + +**Nothing on the wire is serde-untagged — rule, with evidence.** Probe +`scratchpad/untagged-probe/` (result in `untagged-probe-result.txt`), run +2026-09-17 against `rmp-serde 1.3.1` / `rmp 0.8.15` / `serde 1.0.229` (the +versions Huginn's lockfile resolves; `cultnet-rs` pins `rmp-serde 1.3`): +every `#[serde(untagged)]` enum with struct variants **fails to round-trip +under positional MessagePack** (`data did not match any variant of untagged +enum`) and passes only under named maps; externally tagged shapes pass under +both. The reference encodes named maps and so does Rust today, so an +untagged shape would work by accident of an undocumented encoding choice. +`grep untagged packages/cultnet-rs/src packages/cultcache-rs/src` is empty +at `51fb449`; this cut keeps it empty and pins it (section 10). + +## 3. Decisions, with the reasons + +**D1. Strings for field values, not typed enums.** In the Huginn-targeted +design a predicate was `Option>`, closed at compile +time. The substrate cannot know a consumer's enums, and the cache's own index +model is string-valued; so the wire carries strings and the row owner +refuses a value outside its enum at the door. The loss is compile-time +closure; what is kept is runtime closure with a typed refusal, which is the +same guarantee to a caller. + +**D2. Declared aliases, not a field-path language.** `index` and `role` are +names the document's owner declared with `CultIndexAttribute` and +`CultReferenceAttribute`; an undeclared name is refused. A dot-path over the +payload would be the string language the bound excludes, and the cache +already has the declaration mechanism. + +**D3. A new message version, not new fields on v0.** Section 1's fact: +Python reads only the fields it knows and would answer a v0 selector it +did not understand with the wrong rows. A v1 version string makes every +runtime not in this cut refuse or drop by its own dispatch rather than +mis-answer. The cost is that v0 stays answerable by the reference until the +follow-ups land (Q-F). + +**D4. One evaluator in the reference, three engines deleted.** `Select` +over `(descriptor, key, document)` rows from the cache replaces +`CreateRawSnapshotResponse`'s loop, `CultNetDatabaseServer.CreateChangeMessage`'s +`Matches`, and `CultNetDatabaseSubscriptionServer.CreateChangeCore`. +`CultNetSchemaAliasMatching` (`CultNetDatabase.cs:47-97`) becomes the one +alias matcher and goes `public`; the four Mesh copies and two Networking +copies go. + +**D5. Projection becomes a wire value; `_projectRecord` dies.** The +delegate ran after authorization and reached no caller. `projection` on the +selection is the same authority as a value; `_authorizeRequest` and +`_authorizeRecord` stay, because authorization is not selection. + +**D6. Subscriptions evaluate the selection on the snapshot and on every +change, and hop-bearing selections reconcile.** `cites`/`cited` are +set-dependent: a change to row B can change whether row A matches. The +subscription server already owns a diff-against-delivered reconcile +(`Reconcile` `:251-292`, `DeliveredBySourceRecordKey`); a hop-bearing +subscription runs it on every change instead of the per-change fast path. +That is the mechanism by which "watch a question" falls out, and this cut +does **not** add a local `CultNetDatabase.Watch(Selection)`; section 11 +records what that later cut would collapse (Q-H). + +**D7. The Rust runtime carries the evaluator, not only the types.** Huginn +evaluates selections over its own rows; if `select` lived only in C#, Rust +consumers would each write one. `packages/cultnet-rs/src/selection.rs` +holds the types, the cursor, and `select` over a `Row` trait, with no +subscription client in this cut (Huginn does not subscribe). + +**Agreement with our own abandoned prior art** (`ThreadEpiphanyGraphQuery`, +Epiphany `5c62a650`, deleted with its host `5f6f2441`): direction and edge +kind as data, schema derived — agreed; differs as before (predicate not +subgraph read; roles are declared names not free strings; one negation +added; no depth field). + +**Rejected, unchanged in reason:** Qdrant's `Filter` (open dot-path keys, +polymorphic values, OR/threshold/recursion advertised then refused, the +untagged hazard; Cut 11 lowers `FieldPredicate` to `must`/`match.any` in ~30 +lines on the daemon side); ReQL term trees; Firestore `CompositeFilter`; +Mongo/ES magic-key documents; every string-parsed evaluator surveyed. + +## 4. Deletes first + +| Path:lines (at `51fb449`) | Lines | What | +|---|---:|---| +| `src/GameCult.Networking/CultNetDatabaseServer.cs:347-468` | 122 | `CreateChangeMessage`, `CreateRawDocumentRecord`, `Matches`, `MatchesSchema`, `InferSchemaName` — the LiteNetLib selector engine; the handler calls the shared evaluator and the shared raw-record projection | +| `src/GameCult.Networking/CultNetDatabaseSubscriptionServer.cs:424-515` | 92 | `CreateAuthorizedChange`, `CreateChange`, `CreateChangeCore`, `ResolveWireSchemaId`, `MatchesRequestedSchema`, `CreateRawRecord` — the RUDP selector engine | +| `CultNetDatabaseSubscriptionServer.cs:27, :44, :50, :239-240, :314` | 6 | `_projectRecord`, its parameter and its two call sites | +| `CultNetDatabaseSubscriptionServer.cs:294-322` | 29 | `CreateProjectedSnapshot` body: becomes evaluate + authorize + project (~12 lines stay) | +| `src/GameCult.Networking/CultNetDocumentRegistry.cs:263-349` | 87 | `CreateRawSnapshotResponse`: the loop and its reflection over `cache.AllEntries` (`:325-342`); the raw-record construction (`:297-311`) survives as `ToRawRecord` | +| `CultNetDocumentRegistry.cs:505-524` | 20 | `MatchesRequestedSchema`, a copy of `CultNetSchemaAliasMatching.Matches(candidate, descriptor)` | +| `CultNetDocumentRegistry.cs:247-258` | 12 | `CreateSnapshotRequest` (v0 builder); v1 takes a `Selection` | +| **Networking total** | **368** | | +| `src/GameCult.Mesh/CultMeshSnapshots.cs:638-661, 750-773, 889-911` | 71 | three verbatim clones of the selector-carrying options; one `with` copy over a record type remains | +| `src/GameCult.Mesh/CultMesh.cs:2721-2748, 1941-1969` | 57 | the fourth and fifth copies (`ToSnapshotRequestOptions`, `WithPublicationBindingOptions`) | +| `CultMeshSnapshots.cs:973-983` | 11 | `CleanSnapshotFilter`: normalisation is the selection's own validation | +| `CultMeshSnapshots.cs:1000-1009, 1033-1047, 1078-1088` | 36 | the client-side re-filter of a snapshot by schema and `InferSchemaName`; the server's v1 answer is exact, decode stays | +| `CultMesh.cs:2750-2800` | 51 | `ReadDocumentFromSnapshotResponse`'s four-tier fallback (which returns a record with the wrong key when only the schema matches) and `TryDecodeSnapshotDocument`; replaced by one exact read (~10 stay) | +| `CultMesh.cs:3474-3497` | 24 | `IsSameCultDocumentSchema`: `CultNetSchemaAliasMatching`, now public | +| `CultMeshSnapshots.cs:625-636` and the rule at `:198`, `CultMesh.cs:2716` | ~15 | the "no schema filter when keys are given" rule, three times; one place | +| `CultMeshClient.cs:574-604, 830-860, 932-962` selector construction | ~25 net | `{recordKeys, schemaIds}` literals become `Selection` literals; the retry loops stay | +| `CultMeshBodyDemand.cs:177-221` | ~15 net | `CultMeshHotBodySubscription` builds two allowlists; builds one `Selection` | +| `CultMesh.cs:2701-2719, 2838-2858, 2875-2915` | ~20 net | selector construction for peer snapshots and body subscriptions | +| `CultMeshSnapshots.cs:139-201, 434-516, 611-623` overlay logic | ~40 net | overlaying caller `schemaIds`/`recordKeys` onto defaults, four times | +| **Mesh total** | **≈ 365 gross, ≈ 331 net** | see section 11 for what does not go | +| `tests/GameCult.Networking.Tests/NetworkingTests.cs`: `CultNetDatabaseServer_Creates_Filtered_SnapshotResponse` `:3124`, `…_ForCompatibleSchemaAlias` `:3158`, `CultNetDatabaseServer_Creates_Filtered_SubscriptionChange` `:5547`, `…_ForSchemaAlias` `:5601`, `DatabaseSubscription_FiltersLiveChangesByWireSchemaBinding` `:2256`, `…ByRequestedSchemaAlias` `:2310`, and the `projectRecord` lambda in `…AuthorizesRequestAndFiltersSnapshotAndLiveRecords` `:1601-1605` | ~250 | rewritten over v1 selections against the one evaluator (section 10); the rules they pin survive | + +**Not deleted in this cut, by ruling (Q-F):** the v0 message classes and +their three schema files, the v0 arms in `CultNetSchemaMessageSerialization`, +and the v0 handling in the two servers — kept as a **lowering**: a v0 +request lowers to `Selection { schemas: schemaIds, keys: recordKeys, projection: document }` +and is answered through the same evaluator, so v0 has no engine of its own. +They die with the last runtime follow-up. + +## 5. Keeps and moves + +- `CultNetSchemaAliasMatching` (`CultNetDatabase.cs:47-97`), `internal` → + `public`, the one alias matcher for every runtime-side match. +- `_authorizeRequest`, `_authorizeRecord`, `Reconcile`, `Watch`, + `ApplyProjectedChange`, `PublishDemand`, `DemandChanged` and the body-plane + fields of the subscribe message: authorization, reconciliation and demand + are not selection. +- `CultNetDocumentRegistry`'s raw-record construction (`:297-311`) as + `ToRawRecord(descriptor, binding, key, document, options)`; the payload + schema resolution (`:452-503`) untouched. +- The v0 messages, schemas and arms as a lowering (above). +- `CultMeshSnapshotRequestOptions` as a record `{ Selection, ShardId, ShardEpoch, …transport knobs }`. +- Every (B)-class site of the audit (section 11): transport racing, + authority, freshness, body routing, provider-session validation. +- The interop lanes and CI witness (`.github/workflows/cultnet-interop.yml`) + green throughout, because v0 still answers. + +## 6. Adds + +| Add | Owner | Live consumer | Protected invariant | What it replaces | +|---|---|---|---|---| +| `contracts/cultnet/cultnet.selection.schema.json` (`$id`, referenced by `$ref`), `cultnet.snapshot-request.v1.schema.json`, `cultnet.database-subscribe.v1.schema.json`, `cultnet.snapshot-response-raw.v1.schema.json`; registry entries in `CultNetSchemaRegistry.cs` | CultLib contracts | C#, Rust; TS/Py/Kotlin follow-ups | one published shape of a selection, hand-written like its siblings, pinned by vectors in both runtimes | `schemaIds`/`recordKeys`/`includeSnapshot` as the wire's only selection | +| `src/GameCult.Networking/CultNetSelection.cs`: `CultNetSelection`, `CultNetFieldPredicate`, `CultNetCitation`, `CultNetIncoming`, `CultNetSelectionProjection`, `CultNetRecordRef`, `CultNetRawDocumentHeader`, `CultNetSelectionPage`; `Validate(IReadOnlyList)` (declared aliases and roles, non-empty lists) | `GameCult.Networking` | the three message classes, the evaluator, Mesh | a selection is typed data with one validation | `_projectRecord`, the allowlist pair | +| `src/GameCult.Networking/CultNetSelectionEvaluator.cs`: `Select(cache, descriptors, selection, ordinals, asOf)` → ordered, hopped, cursored, projected page; `Matches(selection, descriptor, key, document)` for a single change; the cursor mint/parse with `cursor_stale` / `cursor_invalid` | `GameCult.Networking` | `CultNetDocumentRegistry` (snapshot), both servers (changes), `Reconcile` | one evaluator; order, snapshot and hop have one owner | the three engines (section 4) | +| `CultNetDatabase.LastWriteSequence(schemaId, key)` (a per-key ordinal kept on apply, ~20 lines) | `CultNetDatabase` | the evaluator's order and cursor | a row's ordinal is its last commit's sequence | `storedAt` as the only time | +| v1 message classes beside the v0 ones; the v0→`Selection` lowering (one function) | `GameCult.Networking` | both servers | v0 has no engine of its own | — | +| `packages/cultnet-rs/src/selection.rs`: the types (`Serialize`, `Deserialize`, no `untagged`), `Row` trait (`id`, `ordinal`, `values(index)`, `references()`), `RowSet` trait (`declared_indexes`, `declared_roles`), `Malformed`, `select`, cursor mint/parse, `LIMIT_MAX` | `cultnet-rs` | Huginn (section 12), later Rust services | the same evaluator semantics as the reference, pinned by vectors both ways | Huginn's own `select.rs` from the earlier design | +| `contracts.rs`: `SnapshotRequestV1`, `DatabaseSubscribeV1`, `SnapshotResponseRawV1` variants | `cultnet-rs` | Huginn's daemon | the wire spelling equals the reference's | — | +| `contracts/cultnet/selection-vectors.cs-written.json` and `selection-vectors.rs-written.json`: a fixture row set (`cultnet.interop-selection-row` document type with declared indexes `kind`, `severity`, `tags[]` and references `parent`, `related[]`), twenty selections, and each selection's expected page as ids + `matched` + `next` presence | tests, both runtimes | `NetworkingTests`, `cultnet-rs/tests/selection.rs` | **vectors written by the reference decode and evaluate identically in Rust, and vectors written by Rust decode and evaluate identically in the reference** | a within-runtime round trip, which pins nothing about parity | +| `contracts/cultnet/interop/cultnet.interop-selection-row.schema.json` | contracts | the vectors | — | — | +| `docs/cultnet-selection-cut.md` (this file), a paragraph in `contracts/cultnet/cultnet-distributed-database.md` under "Implemented", and the runtime table row in `docs/runtime-parity-scope.md` | docs | — | describe the live system | — | + +No dependency in either runtime (`schemars` is **not** added to +`cultnet-rs`: the schema is hand-written JSON like every CultNet schema, and +Huginn's derived schema for its own request embeds `Selection` through a +hand-maintained `JsonSchema` impl in Huginn, not through the substrate — +see section 12). No new package, binary, transport, or store format. + +## 7. Per-file changes (code that exists, anchored; new code by name and rule) + +**`src/GameCult.Networking/CultNetSchemaMessages.cs`**: after `:826`, the +three v1 classes; `CultNetSchemaVersions` (`:77`, `:93` and the +`SnapshotResponseRaw` constant) gains `SnapshotRequestV1`, +`DatabaseSubscribeV1`, `SnapshotResponseRawV1`. v0 classes untouched. + +**`CultNetSchemaMessageSerialization.cs:9-85`**: three arms before the +`_ => throw`. + +**`CultNetSchemaRegistry.cs:360-385`**: four `SchemaResourceSpec` entries. + +**`CultNetDatabase.cs`**: `:47` `internal static class` → `public static +class`; a `Dictionary<(string, string), long>` maintained where a mutation +is appended to the shard log (Hands anchors on the append site; section 1's +assumption is confirmed there) and `LastWriteSequence`; `:1052-1075` untouched. + +**`CultNetDocumentRegistry.cs`**: `:247-258` → `CreateSnapshotRequest(messageId, CultNetSelection)`; +`:263-349` → `CreateRawSnapshotResponse(cache, messageId, selection, ordinals, asOf, options)` +calling the evaluator and `ToRawRecord`; `:505-524` deleted. + +**`CultNetDatabaseServer.cs`**: `:276-316` handles v0 (lowered) and v1; +`:332-345` `CreateSubscription` calls `evaluator.Matches(selection, change)` +then `ToRawRecord`; `:347-468` deleted. + +**`CultNetDatabaseSubscriptionServer.cs`**: `:27, :44, :50` `_projectRecord` +deleted; `:112-167` handles v0 (lowered) and v1, and answers a +`snapshot_response_raw.v1` page with `matched`/`asOf`/`next`; `:218-249` +`Watch`: a selection with `cites`/`cited` runs `Reconcile` on every change, +otherwise `Matches` on the changed row; `:294-322` evaluate + authorize + +project; `:424-515` deleted. Module doc `:14-18` rewritten: projection is a +value on the request. + +**`CultNetSelection.cs`**, **`CultNetSelectionEvaluator.cs`** (new): as +section 6. Rules that must die under their own mutation are in section 10. + +**`src/GameCult.Mesh/CultMeshSnapshots.cs`**: `:16-62` the options record +carries `Selection`; `:139-201`, `:434-516`, `:611-636` overlay through one +`WithSelection`; `:638-661`, `:750-773`, `:889-911` deleted; `:973-983`, +`:1000-1009`, `:1033-1047`, `:1078-1088` deleted. +**`CultMesh.cs`**: `:1941-1969`, `:2721-2748`, `:2750-2800` (one exact read +remains), `:3474-3497` deleted; `:2701-2719`, `:2838-2858`, `:2875-2915` +build a `Selection`. +**`CultMeshClient.cs:574-604, 830-860, 932-962`**, **`CultMeshBodyDemand.cs:177-221`**: +`Selection` literals. + +**`packages/cultnet-rs/src/selection.rs`** (new), **`contracts.rs:314-331`** +region gains the three v1 variants, **`lib.rs`** re-exports. **`tests/selection.rs`** +(new): the vectors both directions, the evaluator, the cursor, the +refusals, the untagged grep. + +**`tests/GameCult.Networking.Tests/NetworkingTests.cs`**: the seven tests in +section 4 rewritten; new tests in section 10; the vector writer under +`CULTNET_WRITE_VECTORS=1` following `scripts/write-cultmesh-realtime-frame-vectors.mjs` +and the C#-written pattern the QUIC campaign established (`docs/typescript-quic-realtime-cut.md:15-21`). + +## 8. Authority map + +- **Owner.** CultNet's database organ, `src/GameCult.Networking`, as the + reference: `CultNetSelection` owns the shape and its validation; + `CultNetSelectionEvaluator` owns matching, the hop, the order, the + snapshot and the cursor; `CultNetSchemaAliasMatching` owns schema + identity; `CultNetDatabase` owns a row's ordinal. **The cache owns + addressing**: which names are indexes and which members are references, + and what a value of each is (a string), through `CultIndexAttribute` and + `CultReferenceAttribute` read from `CultDocumentDescriptor`. The + vocabulary reads those declarations and adds none. `packages/cultnet-rs` + is the Rust spelling of the same owner, at wire parity, with the row + owner supplying what the cache supplies in C# (`Row`, `RowSet`). +- **Inputs.** The cache's rows and descriptors, the shard log's sequences, + the selection, the peer's authorization answers. Not inputs: a clock, + a payload path, a transport. +- **Outputs.** Pages (`headers` or `documents`, `matched`, `asOf`, `next`), + per-change match decisions, typed refusals (`selection_invalid`, + `cursor_stale`, `cursor_invalid`) as `cultnet.error.v0` with a code, the + form the reference already uses for routing errors. +- **Derived state.** The page, the order, the incoming-edge index per + evaluation, the cursor. **Demotions:** `schemaIds`/`recordKeys` are no + longer a selection language; they are a lowering of v0 into one. + `_projectRecord` is no longer an authority; projection is a request + value. `CreateRawSnapshotResponse`, `CreateChangeMessage` and + `CreateChangeCore` are no longer engines; they call one. + `IsSameCultDocumentSchema`, the Mesh `InferSchemaName` and the registry's + `MatchesRequestedSchema` are no longer owners of schema identity. +- **Forbidden writers.** Neither server may match a record by a rule of its + own; Mesh may not re-filter a page the server answered; nothing may mint a + cursor a caller could construct; nothing may answer a page over a + different `asOf` than its cursor's; the evaluator may not read a payload + by path, only declared indexes and references; no type on the wire is + `untagged`; the Rust `select` may not diverge from the reference on any + vector. +- **Shared paths.** The evaluator under snapshot, change, and reconcile; + `CultNetSchemaAliasMatching` under every schema match in both assemblies; + `ToRawRecord` under snapshot and change; the v0 lowering under both + servers. +- **Deletion line.** Commit 1: the shape, the evaluator and the v1 + messages beside v0, with the three engines rewired and deleted and the + seven tests rewritten — green. Commit 2: `_projectRecord` and the + Mesh collapse. Commit 3: Rust. Commit 4: vectors both ways and entries. + Nothing lands with two engines alive. +- **Where the line to CultMesh falls.** Mesh is a client that builds + selections and reads pages; it evaluates nothing. Where Mesh watches a + cache locally by name or index (audit sites #2, #4-9, #16-21), it keeps + its own loops until `CultNetDatabase.Watch(Selection)` exists (Q-H). + +## 9. Parity: what this cut covers, and what the other runtimes do + +**In this cut:** the C# reference (both servers, the client, the registry) +and Rust (`cultnet-rs`: types, evaluator, cursor; no subscription client, +because no Rust caller subscribes). Parity is pinned by vectors in both +directions (section 10), not by a round trip inside one runtime. + +**Runtimes not in this cut, stated answer per runtime, by source read:** + +| Runtime | On v0 (unchanged) | On a v1 request it receives | On a v1 page it receives | +|---|---|---|---| +| TypeScript | unaffected; the reference still answers v0 | **refuses**: `parseCultNetMessage` finds no validator for the version and throws (`contracts.ts:728-744`) | refuses the same way | +| Kotlin | unaffected (client only) | **refuses**: `require(schemaVersion == …v0)` throws (`CultMesh.kt:2195`) | n/a as a server; a Kotlin client sends v0 and gets v0 | +| Python | unaffected | **silently drops, no reply**: `handle_server_message` returns `[]` for an unknown version (`interop_peer.py:387`), so a caller times out rather than reading a refusal; **it cannot answer with wrong rows**, because v1 is a version it does not dispatch, which is why D3 chose a version over new fields | as above | +| Rust | in this cut | in this cut | in this cut | + +The one runtime that mis-answers today is none: nothing sends v1 to a +runtime that does not speak it until its follow-up lands, and a stray v1 is +refused (TS, Kotlin, C#) or dropped (Python). Python's drop is a silence, +not a refusal, and is recorded as the first line of its follow-up. + +**Follow-ups, recorded with triggers:** + +- **FU-TS.** `cultnet-ts`: the three v1 contracts, Ajv registration, a + `Selection` type; `cultmesh-ts` builders. Trigger: the first TypeScript + caller that needs a filtered snapshot or subscription (the browser Eve + runtime, when it reads pipeline state). Until then TS refuses v1 loudly. +- **FU-Py.** `cultnet-py` and `cultmesh-py`: reply `cultnet.error.v0 + { code: "unsupported_schema_version" }` for an unknown version (five + lines, the honest minimum, may land before the rest); then the v1 + contracts, and the **three** copies of the selector match + (`interop_peer.py:110-125`, `cultmesh_py/server.py:449-470`, + `cultmesh_py/node.py:1322-1345`) collapsed into one evaluator. Trigger: + the first Python peer asked a v1 question, or the interop lane gaining a + v1 case. +- **FU-Kt.** `cultmesh-kotlin`: v1 snapshot request builder and page + reader. Trigger: an Android/JVM client reading filtered state. +- **FU-v0.** Retire v0's classes, schemas and lowering once FU-TS, FU-Py, + FU-Kt have landed and the interop lanes send v1. Trigger: the last of the + three. +- **FU-Watch.** `CultNetDatabase.Watch(Selection)` in the reference and the + Mesh collapse it enables (section 11, ≈ −240). Trigger: the first + consumer that watches a question locally, or the operator's call (Q-H). + +`docs/runtime-parity-scope.md`'s table gains, per runtime, "typed selection +v1: C# and Rust claimed; TS, Python, Kotlin not claimed (refuse / refuse / +drop)". The claim is written where the parity claims live, not here alone. + +## 10. Verification + +**Builds.** `dotnet build` of `GameCult.Networking`, `GameCult.Mesh` and +their test projects; `cargo test -p cultnet-rs`; the TypeScript workspace +untouched but `npm run test --workspace packages/cultnet-ts` run once to +prove the interop lane still passes on v0. Host = target = workstation for +C# and Rust; no native code. Nothing cleaned. + +**Tests, each named for the rule it pins, with the mutation that kills it — +a loosening where one exists.** + +| # | Test (C# unless marked) | Pins | Revert kills | Loosening kills | +|---|---|---|---|---| +| S1 | `Selection_RefusesUndeclaredIndexRoleAndEmptyLists` | D2, door refusals typed | validation dropped (empty page) | `index` checked against *any* schema's aliases rather than the reachable ones (a predicate on an alias only an excluded schema declares matches nothing silently) | +| S2 | `Evaluator_ConjoinsAnyOfPredicatesOverDeclaredIndexes` | fields | an arm dropped | any-of treated as all-of | +| S3 | `Evaluator_OrdersByLastWriteSequenceThenIdentityAndReverses` | order, `descending` | sort by `storedAt` | `descending` ignored | +| S4 | `Evaluator_PagesExactlyOnceAndTheLastPageSaysSo` | cursor walk | `next` always present | position `>=` (last item repeats) | +| S5 | `Evaluator_RefusesAStaleCursorAfterTheShardLogAdvances` | `cursor_stale` typed | advance ignored (a page over a moved set) | digest check dropped (a cursor accepted under another selection) | +| S6 | `Evaluator_HopsOneEdgeByDeclaredReferenceAndRole` | hop, roles from `CultReferenceAttribute`, `Many` | role ignored | a second hop followed | +| S7 | `Evaluator_NegatedIncomingEdgeIsTheOnlyNegation` | `cited { exists: false }` | `exists` ignored | citer's status consulted (an unauthorized citer's edge dropped) | +| S8 | `Evaluator_HeaderProjectionCarriesNoPayload` | projection | payload carried | `payloadEncoding` carried without payload | +| S9 | `Subscription_EvaluatesSelectionOnSnapshotAndEveryChange_AndReconcilesHopBearingOnes` (rewrite of `:1587`) | D6 | a change matched by v0 allowlists | a hop-bearing subscription taking the per-change fast path (a change to the citer not reconciled) | +| S10 | `V0Request_LowersToASelectionAndHasNoEngineOfItsOwn` (rewrites of `:3124`, `:3158`, `:5547`, `:5601`, `:2256`, `:2310`) | D3/D4 | v0 matched by its own loop | alias matching inlined again in one server | +| S11 | `SchemaAliasMatching_IsTheOneMatcherInBothAssemblies` (grep-shaped, negative) | D4 | — | — | +| S12 | `SelectionVectors_WrittenByTheReference_DecodeAndEvaluateIdenticallyInRust` (Rust reads `selection-vectors.cs-written.json`) and `SelectionVectors_WrittenByRust_DecodeAndEvaluateIdenticallyInTheReference` (C# reads `selection-vectors.rs-written.json`) | **parity** | any semantic drift on either side | a vector whose expected ids are compared as a set (order lost) — the vectors carry ordered ids and `next` presence | +| S13 (Rust) | `selection_is_never_untagged` (grep over `packages/cultnet-rs/src` for `untagged`, empty) and `selection_round_trips_named_and_positional` (both encodings) | the encoding rule | an `untagged` shape added | — | +| S14 (Rust) | `select_over_a_toy_row_set_matches_orders_hops_pages_and_refuses` | D7, no CultCache knowledge in the evaluator | as S1-S8 | as S1-S8 | +| S15 | `Mesh_ReadsASnapshotPageWithoutReFilteringIt` (Mesh tests) | the client trusts the page | the four-tier fallback restored | schema re-filter restored | + +**Negative greps:** `rg -n "untagged" packages/cultnet-rs/src packages/cultcache-rs/src` +empty; `rg -n "InferSchemaName" src/GameCult.Mesh` empty and +`src/GameCult.Networking` only in `CultNetSchemaAliasMatching` and the +registry's payload-schema resolution; `rg -n "MatchesRequestedSchema|MatchesSchema\(" src` +empty; `rg -n "_projectRecord|projectRecord" src` empty; +`rg -n "SchemaIds = .*RecordKeys = " src/GameCult.Mesh` empty (no +allowlist pair assembled by hand); `rg -n "CloneSnapshot(Facade)?RequestOptions" src` at most one. + +**Mutations.** `tools`-style entries in `scripts/mutate-cultmesh.mjs`'s +format with two new targets, `networking` (killer `dotnet test +tests/GameCult.Networking.Tests`) and `rust` (killer `cargo test -p cultnet-rs`), +one entry per rule above with revert and loosening; the runner's +byte-rewrite/verified-restore discipline applies unchanged. The runner is +the QUIC campaign's file and is dirty in the tree; **this campaign adds its +entries in its own file** (`scripts/mutate-cultnet-selection.mjs` or an +entries module the runner imports) and does not edit the QUIC campaign's +targets — Self decides the exact split at landing. + +## 11. The CultMesh subtraction audit, with real numbers + +Method: an Explore pass classified 92 sites in `src/GameCult.Mesh` and +`CultNetDocumentRegistry.cs` as (A) mechanical selection/projection over +schema ids, keys or fields, or (B) a domain rule (authority, freshness, +transport, session). (A) totalled **1,158 lines**, (B) **429**. **(A) is not +a reduction figure**; it is what *could* be expressed as a selection. What +collapses is what has a replacement in this cut. + +| Category | Sites (audit #) | Lines now | After | Net | +|---|---|---:|---:|---:| +| Selector-carrying options cloned five times | #11, #3, #74, #75, #77 | 128 | ~30 (`with` on a record) | **−98** | +| "No schema filter when keys are given" rule, three times | #65, #73, #10 | ~16 | ~4 | −12 | +| `CleanSnapshotFilter` | #79 | 11 | 0 | −11 | +| Client-side re-filter of a snapshot by schema, plus `InferSchemaName` | #80 (part), #81, #82 | ~51 | ~10 (decode only) | −41 | +| Four-tier read fallback + decode gate | #12, #13 | 50 | ~10 | −40 | +| `IsSameCultDocumentSchema` | #22 | 24 | 0 (public matcher) | −24 | +| Selector literals in client bindings | #32, #34, #35 | 93 | ~68 | −25 | +| Hot-body subscription allowlists | #25 | 45 | ~30 | −15 | +| Peer snapshot / body subscribe selector construction | #10, #14, #15 | 81 | ~61 | −20 | +| Snapshot facade overlay logic | #64, #66-70, #72 | ~110 | ~70 | −40 | +| **Collapses in this cut** | | | | **≈ −326** | +| Local cache/database watches by name and index and their predicates | #2, #4-9, #16-21 | ≈ 240 | ≈ 240 | 0 now; **≈ −200 under FU-Watch** | +| Handle catalogs by type/schema, surface catalog, operation payload | #41-49 | 233 | 233 | 0 — these index *handles*, not records | +| Verse discovery selection and reshaping | #36, #38 (part), #39, #40, #83, #85 | ~110 | ~110 | 0 — over Verse observations, not documents | +| Single-file catalog membership | #58-62 | 81 | 81 | 0 — file-format membership | +| Provider session wire decode gate | #50 | 12 | 12 | 0 | +| (B) sites | 24 sites | 429 | 429 | 0 by definition | + +**Plain statement.** `src/GameCult.Mesh` shrinks by about **326 lines of +21,720 (1.5%)** in this cut; a further ≈ 200 collapse only when +`CultNetDatabase.Watch(Selection)` exists (FU-Watch); about 590 of the +audit's (A) lines stay because they select handles, Verse observations or +file-catalog entries, not database records. The operator's expectation of a +net reduction in CultMesh holds, modestly; it does not hold for CultLib as a +whole in this cut, because the Rust runtime is new capability (section 14). +If the expectation was a large reduction, this audit says it is not there +without the watch cut, and it is not there at all for the catalogs and +discovery. + +## 12. Huginn: the consumer cut, and what moved + +**Moves to CultLib (this map):** `Selection`, `Citation`, `Incoming`, +`Projection`, `Page`, the cursor, `select`, the `Row`/`RowSet` traits, the +untagged rule and its probe, the cap, the order rule and the snapshot +contract. Huginn's earlier `select.rs` is never written. + +**Stays with the organ (a smaller, later cut in the Epiphany campaign map, +against a `cultnet-rs` dependency Huginn already has):** + +- `impl Row for PipelineDocumentView`: `ordinal = admission.sequence` + (Q-B A, still recommended; under Q-B B Huginn refuses `cursor_stale` on + advance exactly as the reference does, which is now a legitimate second + option), `values(index)` for the declared aliases `campaign`, `repo`, + `cut`, `kinds`→(schema), `in_force`, `faculty`, `severity`, `confidence`, + `origin`, `authority`, `claim_outcome`, `outcome`; `references()` from + `docs::citations` with the fifteen roles; `RowSet::declared_*` as the + organ's closed lists, so an unknown alias or a value outside an enum + refuses typed. +- `docs::citations`, `CitationRole`, `ResolutionOutcomeKind`, the summary + as the organ's header, the `as_of` restriction of the image to receipts, + the semantic refusal, the ref validation of `cites.target` through the + leaf, and the deletion of `open_items`/`history` with the relation table + unchanged (`history(Subject)` = `kinds: [resolution], cites { target, role: subject }`; + the open lists = five selections). +- **Dropped from the organ's wire:** `PipelineQuery`, `admitted_after/before` + (Q-G), `QUERY_LIMIT_MAX`. Huginn's `Query { instance, selection }` carries + the substrate's type; its published request schema embeds `Selection` + through a hand-maintained `JsonSchema` impl for the `cultnet-rs` types + inside Huginn (the substrate publishes JSON, not `schemars`), pinned by the + existing byte-for-byte test. +- Cut 11's lowering to Qdrant and the after-index application of the hop, + as before. + +The Huginn cut is ordered **after** this cut's commit 3 (Rust) and before +Cut 11 and Cut 13, as 10b was. + +## 13. Deliberately not possible, and why + +OR across predicates (ask twice); negation beyond `cited { exists: false }`; +a predicate on the far end of the hop; a second hop; ranges, dates, text, +paths, sort fields, counts beyond `matched`; a page not tied to `asOf`; +selection across shards or minds; a cursor the caller constructs. Each for +the reason the earlier specification gave, unchanged. + +## 14. Subtraction ledger (estimate) + +| | Removed | Added | +|---|---:|---:| +| `src/GameCult.Networking` | 368 | ~350 (`CultNetSelection` 140, evaluator + cursor 180, ordinals 20, v1 classes and lowering ~40 minus shared) | +| `src/GameCult.Mesh` | ≈ 365 gross | ≈ 40 (one `WithSelection`, one exact read) | +| `packages/cultnet-rs/src` | 0 | ~390 (`selection.rs` 350, `contracts.rs` 40) | +| `contracts/cultnet` | 0 | 4 schema files (~200 lines JSON), 1 interop row schema, 2 vector files (generated) | +| tests, C# | ~250 rewritten | ~450 (S1-S12, S15, the vector writer) | +| tests, Rust | 0 | ~300 (S12-S14) | +| entries | 0 | ~30 entries | +| docs | — | this map; two paragraphs | +| **net source outside tests** | | **≈ −18 in C#, +390 in Rust; ≈ +370 across the repo** | + +The repo grows by about 370 source lines for: a typed selection with a +derived-by-vector schema where two allowlists were the only language; +projection as a value where it was a delegate no caller reached; an exact +snapshot cursor where paging did not exist; one evaluator where three +engines and six schema matchers stood; a Rust runtime that did not have the +capability at all. CultMesh proper shrinks ≈ 326. The liability retired is +not in the line count: five copies of one options record, four spellings +of schema identity, a client that re-filtered what the server answered and +a read that could return the wrong key. + +## 15. Build budget + +C#: two assemblies and two test projects, debug, workstation. Rust: +`cultnet-rs` lib + tests, warm target dir, +0 to +60 paths. Nothing cleaned. +No native, no TypeScript build beyond one interop-lane run. + +## 16. Operator questions, one batch + +- **Q-A. Leaf `Short` titles for question and ruling** (Huginn/Epiphany). + Unchanged: **A, not now** (recommended); B, a leaf follow-up before Cut 13; + C, a text projection (Cut 11's question). Depends: the organ's header row + for those two kinds. +- **Q-B. Huginn's receipt ordinal.** **A, record it** (recommended; exact + order, no `cursor_stale` on an append-only mind); **B, do not**: Huginn + refuses `cursor_stale` on advance like the reference does — now a + legitimate option under one contract, costing a re-walk on a busy mind + and id-order ties within a second. Depends: Huginn's consumer cut only. +- **Q-C. Delete `open_items` and `history`.** **A, delete** (recommended); + B, thin presets in Huginn; C, wire operations (refused). Depends: Cut 13's + tool list. +- **Q-D. The representation.** **A, declared-alias any-of over strings in a + new v1 selection** (recommended; D1, D2); B, Qdrant's `Filter` (rejected, + section 3); C, typed enums on the wire (impossible in the substrate: it + cannot know a consumer's enums; the organ keeps the typed refusal at its + door). Depends: everything in sections 2-10. +- **Q-E.** Withdrawn: the seam question is answered by the placement ruling. +- **Q-F. v0's life.** **A, keep v0 answerable in the reference as a + lowering until FU-TS, FU-Py, FU-Kt land** (recommended; the interop CI + witness stays green, and v0 has no engine of its own); B, delete v0 now + and break the three runtimes' lanes; C, add the new fields to v0 — + refused by D3 because Python would mis-answer. Also under Q-F: whether + FU-Py's five-line "reply with `unsupported_schema_version`" lands ahead of + its trigger (recommended yes; it is a refusal where there is a silence). +- **Q-G. `descending` in place of the admission window.** **A** (recommended): + one fixed order, reversible; "the latest N" is `descending, limit: N`; + Huginn's `admitted_after/before` leave its wire. **B**: keep a window as + the one range, on the ordinal only (`sinceOrdinal`), which is a second way + to say what a cursor says. **C**: keep Huginn's date window as an + organ-side alias any-of over `admitted_on` dates — expressible today with + no substrate change, weaker than a range, honest. Depends: Huginn's + filter list; nothing in the substrate. +- **Q-H. `CultNetDatabase.Watch(Selection)` as a named follow-up cut.** + **A, yes, after the runtime follow-ups** (recommended): it is the + "watch a question" affordance the seam was drawn for and the ≈ 200 further + Mesh lines; B, fold into this cut — refused by the coordinator's own + constraint not to design the watch now; C, never — leaves the local + watch helpers as they are. +- **Q-I. Vectors: the fixture row type.** **A, a dedicated + `cultnet.interop-selection-row`** (recommended; declares indexes and + references purposely, both runtimes register it); B, reuse + `cultnet.interop-note` and add index/reference declarations to it — + touches the live interop lane's document. + +What depends on each: S1-S8 on Q-D A; S5 on the shard-log assumption +(section 1) and on Q-B for Huginn; S9 on D6; S10 on Q-F A; S12 on Q-I; +the Huginn cut on Q-B, Q-C, Q-G; FU-Watch on Q-H. + +## 17. What was probed, read, and not settled + +**Probed:** the untagged round trip (section 2). **Read:** every line +anchored above; the CultMesh audit's 92 sites by an Explore pass whose +classification I checked at the sites that carry the ledger (the five +clones, the four matchers, the fallback, the two engines). **Not run:** +`dotnet` or `cargo` on CultLib — the tree is dirty from the QUIC campaign +and no claim here depends on a build; Hands takes the baselines named in +Pins. **Not settled:** whether every committed write has a shard-log +sequence (section 1, Hands confirms at the append site); the exact split of +mutation entries against the QUIC campaign's runner (section 10, Self at +landing); whether MessagePack-CSharp needs a union attribute for the +page's `headers | documents` (it does not if both are optional arrays with +exactly one present, which is the spelling chosen so no union is needed — +Hands confirms the schema says "exactly one" with `oneOf` over `required`). From 440709829deece8ba436b543ae274af4a950a26c Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 00:37:16 +0200 Subject: [PATCH 78/94] Commit the container the linux-x64 entries are honest in MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The image the bridge is built and mutated in existed nowhere in the repository, and the recipe that stood in for it installed a C++ toolchain and no JavaScript runtime — so the container could not run the harness that checks the bridge it had just built. It is a file now, pinned to the same debian:13 digest as the release workflow, carrying ninja, Node, setarch and MsQuic's four runtime dependencies. The harness configures with `-G Ninja` on linux-x64, which is what scripts/build-quic-native.sh uses. CMake's Linux default is Makefiles, the image carries ninja rather than make, and the default configured nothing at all: the first run in the committed container died in cmake. It said so, because the control now prints what the child said, which is the whole point of that change. The seccomp requirement is stated where someone hitting it will read it — the bridge's README, beside the recipe — rather than being knowledge the runner assumes its caller already has. Co-Authored-By: Claude Opus 5 --- native/GameCult.Mesh.Quic.Native/README.md | 20 ++++++++++ .../tests/cultmesh_quic_native_tests.cpp | 5 ++- scripts/mutate-cultmesh.mjs | 23 +++++++++-- scripts/quic-native-linux-dev.Dockerfile | 38 +++++++++++++++++++ 4 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 scripts/quic-native-linux-dev.Dockerfile diff --git a/native/GameCult.Mesh.Quic.Native/README.md b/native/GameCult.Mesh.Quic.Native/README.md index 60531975..4653f86c 100644 --- a/native/GameCult.Mesh.Quic.Native/README.md +++ b/native/GameCult.Mesh.Quic.Native/README.md @@ -102,6 +102,26 @@ shipped beside it resolves without being installed system-wide. A Linux host still needs MsQuic's own runtime dependencies present: `libssl3t64`, `libnuma1`, `libxdp1`, `libnl-route-3-200`. +The development loop for it is one committed image, +[`scripts/quic-native-linux-dev.Dockerfile`](../../scripts/quic-native-linux-dev.Dockerfile), +pinned to the same `debian:13` digest the release workflow builds in. It carries +the toolchain, MsQuic's runtime dependencies, `setarch`, and Node, because the +mutation harness that drives the runtime-lifetime scenarios is a Node script and +a container that cannot run it cannot check the bridge it just built: + + docker build -t cultlib-quic-native-dev -f scripts/quic-native-linux-dev.Dockerfile scripts + docker run --rm --security-opt seccomp=unconfined -v F:\Projects\CultLib:/src -w /src \ + cultlib-quic-native-dev bash -lc "scripts/build-quic-native.sh && node scripts/mutate-cultmesh.mjs native" + +`--security-opt seccomp=unconfined` is load-bearing, not caution. The +ThreadSanitizer configuration needs the process's address space where it expects +it, so `scripts/mutate-cultmesh.mjs` re-executes those runs under `setarch -R`, +which asks the kernel for `personality(ADDR_NO_RANDOMIZE)`. Docker's default +seccomp profile denies that call. Without it ThreadSanitizer dies before `main` +with "unexpected memory mapping" — a configuration that never starts, which a +mutation harness would otherwise read as every mutant being killed. The harness +stops with that diagnosis rather than reporting kills it did not earn. + Where an artifact was built is part of what it is. The Linux binary is linked against Debian 13's glibc, so a build from anywhere else is a different artifact whatever the file name says. diff --git a/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp b/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp index 36794d22..2b2fa3a3 100644 --- a/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp +++ b/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp @@ -224,8 +224,9 @@ std::string HoldCloseOnce(int pollers) { for (auto& thread : threads) thread.join(); if (peak != pollers) - return "the library counted a peak of " + std::to_string(peak) + " host call(s) inside it, not " + - std::to_string(pollers) + "; the blocking crossing is not inside a call scope"; + return "the library's peak count of host calls inside it was " + std::to_string(peak) + ", not " + + std::to_string(pollers) + ": either the blocking crossing is not inside a call scope, or it " + + "did not block long enough for the pollers to be inside it together"; if (at_close != pollers) return "the close began its wait with " + std::to_string(at_close) + " host call(s) counted inside, not " + std::to_string(pollers) + diff --git a/scripts/mutate-cultmesh.mjs b/scripts/mutate-cultmesh.mjs index c8cced18..c75a9041 100644 --- a/scripts/mutate-cultmesh.mjs +++ b/scripts/mutate-cultmesh.mjs @@ -39,10 +39,21 @@ // reported killed from a win32-x64 release run where both in fact survive, and // die deterministically only under linux-x64 AddressSanitizer. // -// This script tests the platform it is running on. For the linux-x64 native -// entries, run it inside the Debian 13 container the bridge is built in, with -// cmake, ninja, a C++20 compiler and Node present; a Windows run reports those -// entries as skipped and says so. +// This script tests the platform it is running on, and a run that skipped +// entries exits 2 rather than 0: those rules were covered by nothing. For the +// linux-x64 native entries, run it inside the committed development image, +// `scripts/quic-native-linux-dev.Dockerfile`, which is the same debian:13 digest +// the bridge is built in and carries Node, ninja, setarch and MsQuic's runtime +// dependencies: +// +// docker build -t cultlib-quic-native-dev -f scripts/quic-native-linux-dev.Dockerfile scripts +// docker run --rm --security-opt seccomp=unconfined -v F:\Projects\CultLib:/src -w /src \ +// cultlib-quic-native-dev bash -lc "node scripts/mutate-cultmesh.mjs native" +// +// The seccomp flag is required, not cautious: the ThreadSanitizer configuration +// is re-executed under `setarch -R`, and Docker's default profile denies the +// personality call that needs. See `explainUnrunnable` below, and the bridge's +// README. // // node scripts/mutate-cultmesh.mjs [target...] @@ -625,6 +636,10 @@ function nativeScenariosPass() { try { execFileSync("cmake", [ "-S", source, "-B", build, + // The same generator scripts/build-quic-native.sh uses. CMake's Linux + // default is Makefiles, and the container the bridge is built in carries + // ninja rather than make, so the default configured nothing at all. + ...(platform === "linux-x64" ? ["-G", "Ninja"] : []), "-DCMAKE_BUILD_TYPE=RelWithDebInfo", `-DCMAKE_CXX_FLAGS=${flags}`, `-DCMAKE_EXE_LINKER_FLAGS=${flags}`, diff --git a/scripts/quic-native-linux-dev.Dockerfile b/scripts/quic-native-linux-dev.Dockerfile new file mode 100644 index 00000000..7c796749 --- /dev/null +++ b/scripts/quic-native-linux-dev.Dockerfile @@ -0,0 +1,38 @@ +# The linux-x64 development loop for the CultMesh native QUIC bridge: build it, +# run its scenarios, and run the mutation harness over it. Not a release +# builder — the shipped Linux artifact comes from the workflow (see +# docs/typescript-quic-realtime-cut.md). +# +# This image is what the harness's linux-x64 entries are honest about. Before it +# was committed, the recipe in the cut map installed a C++ toolchain and no +# JavaScript runtime, so the container the bridge was built in could not run the +# runner that mutates it at all. +# +# docker build -t cultlib-quic-native-dev -f scripts/quic-native-linux-dev.Dockerfile scripts +# docker run --rm --security-opt seccomp=unconfined -v F:\Projects\CultLib:/src -w /src \ +# cultlib-quic-native-dev bash -lc "scripts/build-quic-native.sh && node scripts/mutate-cultmesh.mjs native" +# +# `--security-opt seccomp=unconfined` is not optional and not caution. The +# ThreadSanitizer configuration needs the process's address space where it +# expects it, so the harness re-executes it under `setarch -R`, which asks the +# kernel for personality(ADDR_NO_RANDOMIZE). Docker's default seccomp profile +# denies that call, and without it ThreadSanitizer dies before main with +# "unexpected memory mapping" — a whole configuration failing to start, which a +# mutation harness reads as every mutant being killed. +# +# Pinned by digest, not by the moving tag: the artifact is the toolchain that +# made it. +FROM debian:13@sha256:f324c7ff54321e8d9c588493a20244965938ce0aa50bbd1022d38010e9ffc4b1 + +# cmake, ninja and g++ build the bridge and its scenario runner; curl, +# ca-certificates and dpkg fetch and unpack the pinned libmsquic deb; +# util-linux carries setarch; nodejs runs scripts/mutate-cultmesh.mjs. The four +# libraries are MsQuic's own runtime dependencies, which the bridge does not +# vendor. +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + bash ca-certificates cmake curl dpkg g++ ninja-build nodejs util-linux \ + libssl3t64 libnuma1 libxdp1 libnl-route-3-200 \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /src From 211b5e320f12d2b64959927810d38e381407a7f4 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 00:48:50 +0200 Subject: [PATCH 79/94] Point the Linux recipe at the container that exists The map carried a one-line invocation that installed no JavaScript runtime, so it could not run the mutation runner, and said nothing about disabling randomisation or relaxing seccomp. That is how the Linux path came to be red for everyone except the agent that had found the flags by hand. The recipe now lives with the image and the bridge README, and the map points at them. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index bd0be20a..164d51ad 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -1190,9 +1190,19 @@ Verification: (P13), a client connection to it, answers event 3 with accept, sees event 2 on both sides, opens a latest-only stream, sends one frame with `fin`, and reads event 6 on the server side with the identical bytes. -- Linux, development loop: `docker run --rm -v F:\Projects\CultLib:/src debian:13 bash -lc "apt-get update && apt-get install -y cmake ninja-build g++ curl ca-certificates dpkg && /src/scripts/build-quic-native.sh"` - then the same FFI smoke under `node:24` in the container. This is a Linux - build on a Linux host; it is not the release artifact (Q6). +- Linux, development loop: build the committed image + `scripts/quic-native-linux-dev.Dockerfile`, pinned to the same `debian:13` + digest as the release workflow, and follow the recipe in the bridge's own + README. The image carries the compiler, Ninja, Node, `setarch` and the + library's runtime dependencies, and the sanitizer configurations need the + container's default seccomp profile relaxed so randomisation can be + disabled. The README and the Dockerfile header own that recipe; this map + does not restate it. This is a Linux build on a Linux host; it is not the + release artifact (Q6). *(The earlier one-line `docker run` recipe here + installed no JavaScript runtime and could not run the mutation runner at + all, and said nothing about randomisation or seccomp, which is how the + Linux path came to be red for everyone but the agent that had found the + flags by hand.)* - Build economy: the only builds are the native CMake target and `tests/GameCult.Mesh.Quic.Native.Tests` (which pulls `GameCult.Mesh.Quic`, `GameCult.Mesh.Quic.Native`, `GameCult.Mesh`, `GameCult.Networking`, From ee91062cee738420a3e1658039ed092535dc1bd9 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 01:13:08 +0200 Subject: [PATCH 80/94] Finish the selection map, and price it honestly The cache already declares and persists what type each member is, so numbers cost no migration. What they do cost is a public way to read a declared value at all, because the evaluator today cannot reach one from outside the cache, which is why the existing snapshot loop reflects. That is a hundred and fifty lines, not sixty, and the ledger moves the wrong way to say so. Three claims inherited from the earlier pass were wrong and were cut rather than designed around. A fifth selector engine turned up in Rust. And the cache's index maps keep one key per value, so an evaluator that reached for them would answer a query about a whole family with a single row. Watching a selection is mapped as its own cut, where nine overloads that are a query language in disguise collapse into one. Co-Authored-By: Claude Fable 5.1 --- docs/cultnet-selection-cut.md | 889 ++++++++++++++++++++++++++++++---- 1 file changed, 795 insertions(+), 94 deletions(-) diff --git a/docs/cultnet-selection-cut.md b/docs/cultnet-selection-cut.md index de2f9045..fa144f75 100644 --- a/docs/cultnet-selection-cut.md +++ b/docs/cultnet-selection-cut.md @@ -5,9 +5,12 @@ No code in this document has been written; nothing here is committed by Imagination. This is its own campaign with its own map; it does not touch `docs/typescript-quic-realtime-cut.md` or any code in that tree. -Status: cut map for one cut, **Cut 1: the selection vocabulary in the C# -reference runtime and the Rust runtime**, with the follow-on runtime cuts -and the Huginn consumer cut named and not mapped. +Status: cut map for two cuts. **Cut 1: the selection vocabulary in the C# +reference runtime and the Rust runtime** (sections 1-17), with the +follow-on runtime cuts and the Huginn consumer cut named and not mapped. +**Cut 2: watching a selection** (section 18), mapped to the same standard, +landing after Cut 1 and depending on it. Cut 1 goes to Hands without +waiting on anything in Cut 2. **Rulings this map is written under (operator, 2026-09-17):** @@ -88,8 +91,22 @@ Baselines: `src/GameCult.Networking` 14,848 lines; `src/GameCult.Mesh` member as a reference; the descriptor records `IsReference`, `IsMany`, `TargetSchemaName` (`CultCache.cs:1069-1080`). So a field predicate's key is an index alias and a hop's role is a reference member, both declared - by the document's owner and both readable from `CultDocumentDescriptor`. - No cache change is needed for addressing. + by the document's owner. +- **The declarations are public; the values are not.** `ToCatalogEntry()` + (`CultCache.cs:151-176`) is public and carries every member's `Slot`, + `MemberName`, `TypeName`, `IsReference`, `IsMany`, `TargetSchemaName`, + `IsName`, `IndexAlias`. But `CultDocumentDescriptor.Members` (`:149`) and + `IndexAccessors` (`:148`) are **`internal`**, and `GameCult.Caching` + declares no `InternalsVisibleTo` for `GameCult.Networking` (the only + `InternalsVisibleTo` in `src/` outside the vendored Unity tree is + `GameCult.Caching.MessagePack` → `GameCult.Caching.Tests`). That is why + `CreateRawSnapshotResponse` reaches for reflection at + `CultNetDocumentRegistry.cs:325-342`. **An evaluator outside the cache + assembly cannot read a declared index's value today**, by any means the + cache offers. The earlier claim in this map that no cache change is + needed for addressing was wrong: addressing is declared publicly and + *readable* only inside the cache. Section 6 carries the read surface as + an add; sections 7 and 14 carry its cost. - **Schemas are hand-written JSON** in `contracts/cultnet/*.schema.json`, listed by file name in `CultNetSchemaRegistry.cs:360-385`; TypeScript compiles them with Ajv and refuses unknown fields @@ -134,6 +151,100 @@ Baselines: `src/GameCult.Networking` 14,848 lines; `src/GameCult.Mesh` `storedAt` and the cursor refuses on any advance (section 3 says what that costs). +**The Aetheria catalog as a hostile example, verified at +`F:\Projects\Aetheria\Assets\Scripts\ServerShared`:** + +- **Inheritance.** `ItemData.cs:272` `abstract class ItemData` (`Name` + `:275`, `Mass` `:284`), `:313` `abstract class CraftedItemData : ItemData` + (which re-declares `Name` at `:327`, hiding the base's), and only the + leaves carry `[CultDocument]`: `SimpleCommodityData` `:300`, + `CompoundCommodityData` `:330`, `GearData` `:449`, and more. The cache's + `DiscoverMembers` (`CultCache.cs:838-875`) walks `current.BaseType`, so a + leaf's descriptor carries every inherited member with its attributes + (`GetCustomAttribute` reads the member's own attribute wherever it is + declared). Inherited addressing therefore already resolves per leaf. + **Corrected on a second read:** duplicate *slots* are refused + (`:931-935`), and a **hiding member is already refused too** — `:937-943` + groups keyed members by `Member.Name` and rejects any name carried at two + different slots (`HiddenMemberMessage`), while a hiding member re-using + one slot is caught by the duplicate-slot rule. So `CraftedItemData`'s + `Name` at `ItemData.cs:327` hiding `:275` is **not registrable in + CultCache as it stands**, however the aliases fall; that is a finding for + the Aetheria campaign, not a hole here. What is *not* refused by name is + two members with **different names** carrying the **same index alias** + (base `[CultIndex("mass")] Mass`, leaf `[CultIndex("mass")] Weight`). + That does not collide silently either: the alias map is built by + `ToDictionary` at `:462-468`, which throws `ArgumentException("An item + with the same key has already been added")` — a real refusal, from the + wrong owner, naming neither schema nor member nor alias. D10 is therefore + a **renaming of an existing refusal**, not a new rule, and is smaller + than it first looked. +- **A reference to an abstract target.** `FactionProduct.cs:24` + `CultRecordRef Design`. `PersistedMember.FromMember` + (`CultCache.cs:1069-1071`) takes the target type and reads + `CultDocumentAttribute` from it — an abstract base has none, so + **`TargetSchemaName` is `null` today for exactly this reference**. The + registry can compute the leaf set by assignability (it already does for + index lookups, `:1506`, and store routing, `:1828`) but records nothing. +- **A dictionary reference with a value.** `ItemData.cs:333-334` + `[CultReference(typeof(PersonalityAttribute), many: true)] Dictionary, float> DemandProfile`. + The descriptor records `IsMany` (`:1080`) and nothing else: **no code in + the cache enumerates a many-reference's targets**, and the only accessor + is `Getter = document => getValue(document)?.ToString()` (`:1082`), which + on a dictionary yields the CLR type name. The edge and its payload are + declared and unreadable. +- **Numbers.** `PersistedMember.MemberType` (`:1053`) knows the member is a + `float`, and the catalog persists it as `TypeName` (`:38`, `:192`, + compared by `CompareSchemaShapes` `:605-629`), so **a member's numeric + type is already declared and persisted**; what is missing is a typed + accessor beside the string one. Adding an accessor is a runtime change + with no catalog-shape or hash change, because `TypeName` is already in + the canonical shape. + +**The cache's index maps are unique indexes, and the evaluator must not use +them.** `Index(stored)` (`CultCache.cs:1849-1862`) writes +`MapOf(_indexes, (type, alias))[value] = key` — **one key per value, last +writer wins**. Two rows of one type sharing an index value do not collide +loudly; the second silently displaces the first in the map. `GetByIndex` +(`:1502-1508`) reads that map and `Single` (`:1838-1848`) throws only +when *several types* assignable to `T` each contribute a key, never for two +rows of one type. So `GetByIndex` answers "the row that most recently +claimed this value", not "the rows with this value". + +The consequence for this cut is a rule, not a caveat: **the evaluator +evaluates every predicate per row, through the accessor, and never through +`_indexes` or `GetByIndex`.** The declared alias is an *addressing* name — +the cache's own lookup map is a different, lossier thing that happens to be +built from the same declaration. A "use the index, it is already there" +optimisation would turn `kind any_of [weapon]` into a one-row answer. S23 +pins it, `WatchByIndex` already has the bug (section 18), and the +unique-index behaviour itself is left exactly as it is: it is the cache's +own contract for a single-record lookup and this cut does not renegotiate +it. + +**A fourth selector engine, in Rust, that this map's first draft missed.** +`packages/cultnet-rs/src/snapshot_query.rs` (339 lines, `pub use` at +`lib.rs:29`) already serves and asks snapshot requests: + +- `serve_read_only_raw_snapshot` `:64-130` is an engine — it walks the + source's records, refuses a duplicate identity and an unregistered + schema, applies a `CultNetReadOnlySnapshotPolicy` allowlist of + `(schema_id, record_key)` pairs, then filters by the request's + `schema_ids` and `record_keys` (`:112-125`). The policy is + **authorization** and stays; `:112-125` is the fifth copy of the same two + allowlists and goes, as the C# three do. +- `CultNetRawSnapshotQuery` `:158-285` is the client side, and it exposes + the sharpest limit of the two-allowlist model: `request()` `:195-217` + turns a set of exact `(schema, key)` pairs into the **cross product** of + their schemas and their keys, and `accept_response` `:219-284` then + *errors* on any record the cross product dragged in + (`"snapshot response contains unexpected record"`). Asking for `(A,x)` + and `(B,y)` asks for four and refuses two. **v1 does not fix this**: + `schemas × keys` is still a cross product (section 13, Q-M). What v1 does + change is that `accept_response`'s check is a *declared expectation*, not + a re-filter of a page the server got right, and section 8's forbidden + writer is worded to keep that distinction honest. + **The CultMesh audit** (Explore pass over `src/GameCult.Mesh` and `CultNetDocumentRegistry.cs`, 92 sites classified) is in section 11 with its numbers. @@ -156,7 +267,12 @@ Selection { limit: uint32? // clamped 1..=200 cursor: string? // opaque; minted by the answering server } -FieldPredicate { index: string, anyOf: string[] } // anyOf non-empty; index must be declared on some schema the selection can reach, else refused +FieldPredicate { // one operator per predicate, named by `op`; no union, no untagged + index: string // a declared index alias, reachable on some schema the selection can reach, else refused + op: "any_of" | "lt" | "le" | "ge" | "gt" + values: string[]? // present iff op = any_of; non-empty + number: float64? // present iff op is a comparison; the alias must be declared numeric on every reachable schema that declares it +} Citation { target: RecordRef, role: string? } // target validated as a reference the row owner recognises Incoming { role: string, exists: bool } RecordRef { schemaId: string, recordKey: string } @@ -166,8 +282,15 @@ SelectionPage { // cultnet.snapshot_r asOf: uint64 // the snapshot the page is exact for next: string? // absent on the last page headers: RawDocumentHeader[]? | documents: RawDocumentRecord[]? // exactly one present, by projection + edges: Edge[]? // present iff the selection has `cites` or `cited`: the edges the hop traversed shardId?, shardEpoch?, shardLogSequence? // as v0 carries them } +Edge { + from: RecordRef // the citing row + role: string + to: RecordRef // the cited row, its schema resolved to the leaf actually stored + payloadEncoding: "messagepack"?, payload: bytes? // the value attached to the edge (a dictionary's value), typed by the member's declared value type; present under `document`, absent under `header` +} RawDocumentHeader = RawDocumentRecord minus payload, payloadEncoding ``` @@ -192,33 +315,72 @@ Messages: `cultnet.snapshot_request.v1 { messageId, selection, shardId?, shardEp replay is not this cut's); Huginn never refuses (append-only, one writer). One contract, two honest servers. A cursor that does not decode, or whose digest is not this selection's, is `cursor_invalid`. -- **Fields** are any-of over string values of one declared index, conjoined - across predicates. A row of a schema that does not declare the index - never matches it. An `index` no reachable schema declares, an empty - `anyOf`, an empty `keys` or `schemas` list, and a `role` no schema - declares are refused typed at the door (`selection_invalid { field, value }`), - never answered as an empty page. Values are strings because the cache's - indexes are strings (`CultCache.cs:1084`); an enum-typed field on the - consumer's side is a string on the wire and the row owner refuses a value - its enum does not carry — the closed key set survives as "declared - aliases only", and the fixed operator survives as any-of. +- **Fields** are predicates over one declared index each, conjoined across + predicates: `any_of` over string values, or one of four comparisons + (`lt`, `le`, `ge`, `gt`) against one number over a declared numeric + member. A row of a schema that does not declare the index never matches + it. An `index` no reachable schema declares, an empty `values`, a + comparison on an alias any reachable schema declares non-numeric, an + empty `keys` or `schemas` list, and a `role` no schema declares are + refused typed at the door (`selection_invalid { field, value }`), never + answered as an empty page. `any_of` values are strings because the + cache's indexes are strings (`CultCache.cs:1084`); comparison numbers are + IEEE float64 on the wire, and a member of an integer type wider than 53 + bits compares at float precision — a stated limit, not a hidden one. No + range operator (two predicates on one alias make a range), no `ne`, no + nesting. +- **Inheritance.** A schema is a leaf: only a type with `[CultDocument]` + has a schema name, and `schemas` names leaves. A predicate on an alias + applies to every reachable leaf whose descriptor carries a member with + that alias, inherited or own — the cache already discovers inherited + members per leaf, so "gear or commodities with `mass` over 10" is + `schemas: [geardata, simplecommoditydata], fields: [{index: mass, op: gt, number: 10}]` + with `mass` declared once on the abstract base. Two leaves that each + declare a member with the same alias independently are two members; the + predicate reads each leaf's own. One leaf that resolves the same alias to + two members (a base member and a hiding re-declaration both carrying the + alias) is refused at registration (D10). A numeric comparison on an alias + that is numeric on one reachable leaf and a string on another is refused + at the door, because the row owner cannot compare a string. - **The hop** reads edges the row owner declares: in the reference, members - with `CultReferenceAttribute` (role = the member's index alias or name; - target = the referenced key, or each key when `Many`); in Rust, the - `Row::references` the consumer implements. The citer's status, fields and - authorization are not consulted by the hop; one hop, no second. + with `CultReferenceAttribute` (role = the member's index alias or name); + a one-reference yields one edge, a many-reference yields one edge per + element, and a dictionary keyed by references yields one edge per key + **with the value as the edge's payload**. In Rust, `Row::references()` + yields `(role, target, payload)`. **A reference's target is a set of + leaves**: the declared target type's own schema if it is a leaf, else + every registered leaf assignable to it (`CraftedItemData` → + `compoundcommoditydata`, `consumableitemdata`, …). The hop follows an + edge into any row whose schema is in that set. **A stored edge naming a + row whose schema is outside the set refuses the selection** + (`reference_outside_target { from, role, to }`), not skips it: an edge the + declaration forbids is corrupt data and a read does not paper over it. + The citer's status, fields and authorization are not consulted by the + hop; one hop, no second. +- **Edges in the answer.** A selection with `cites` or `cited` returns, beside + the rows, the edges the hop traversed, each with its payload under + `document` projection and without it under `header`. A weighted reference + and a bill of materials are the same shape: follow the edge, return the + payload, filter the rows. **Filtering on the payload as part of the + traversal is not expressible** (section 13): that is a join condition. - **Projection.** `header` is the record without its payload; `document` is the record. The consumer decides what a header *means* for typed rows (Huginn's typed summary is its header; the substrate carries whichever type the page was instantiated with). - **Not on the wire:** the admission window (`admittedAfter/Before`) of Huginn's Cut 9 — `descending` plus the cursor answer "the latest"; a date - window is a range, and ranges are out (Q-G). + window is a range, and ranges are out (R-3). -**The bound, carried forward in force.** Closed key set (declared aliases), -fixed operator (any-of), no path language, no expression terms, no OR, one -negation, one hop, no depth field, no sort field, no range, no text. -Section 13 lists what is deliberately impossible. +**The bound, carried forward in force, with one widening the operator +ruled.** Closed key set (declared aliases), a closed operator set (any-of +and four comparisons, one per predicate, no nesting), no path language, no +expression terms, no OR, one negation, one hop with its edges returned, no +depth field, no sort field, no text, no predicate on an edge's payload in +the traversal. Section 13 lists what is deliberately impossible. The +capability set is now: **C1** typed predicates over declared members, +string any-of and numeric comparison; **C2** projection; **C3** order and +cursor; **C4** one hop, both directions, returning typed edge payloads; +**C5** existence and count without bodies. **Nothing on the wire is serde-untagged — rule, with evidence.** Probe `scratchpad/untagged-probe/` (result in `untagged-probe-result.txt`), run @@ -253,7 +415,7 @@ Python reads only the fields it knows and would answer a v0 selector it did not understand with the wrong rows. A v1 version string makes every runtime not in this cut refuse or drop by its own dispatch rather than mis-answer. The cost is that v0 stays answerable by the reference until the -follow-ups land (Q-F). +follow-ups land (R-1, a scheduled deletion with a named trigger). **D4. One evaluator in the reference, three engines deleted.** `Select` over `(descriptor, key, document)` rows from the cache replaces @@ -276,7 +438,7 @@ subscription server already owns a diff-against-delivered reconcile subscription runs it on every change instead of the per-change fast path. That is the mechanism by which "watch a question" falls out, and this cut does **not** add a local `CultNetDatabase.Watch(Selection)`; section 11 -records what that later cut would collapse (Q-H). +records what that later cut would collapse; it is Cut 2, section 18 (R-5). **D7. The Rust runtime carries the evaluator, not only the types.** Huginn evaluates selections over its own rows; if `select` lived only in C#, Rust @@ -284,6 +446,108 @@ consumers would each write one. `packages/cultnet-rs/src/selection.rs` holds the types, the cursor, and `select` over a `Row` trait, with no subscription client in this cut (Huginn does not subscribe). +**D8. Numbers are addressable through the type the cache already declares; +the cache gains accessors, not attributes.** A comparison needs a numeric +value the string getter cannot give. `CultCache.cs:1053` holds the CLR +`MemberType` and the catalog already persists `TypeName` in the canonical +shape, so numeric-ness is declared; what is added is runtime: on each +member, `ValueOf(document) -> object?` and `NumberOf(document) -> double?` +(non-null exactly for the closed set of CLR numeric types), and the public +member entry exposes `IsNumeric` derived from `TypeName`. No new attribute, +no catalog-shape change, no schema hash moves, no migration. Rust mirrors +it as `Row::number(index)` and `RowSet::is_numeric(schema, index)`; the +consumer decides from its own types. + +**Verified by source read, because everything downstream rests on it:** +`CultDocumentMemberDescriptor.TypeName` is set at `CultCache.cs:474` from +`CultSchemaTypeNames.FromType(member.MemberType)`, which renders a CLR full +name (`System.Single`, `System.Nullable`, +`System.Collections.Generic.Dictionary, +System.Single>`); `ToCatalogEntry()` `:168` copies it into +`CultSchemaMemberCatalogEntry.TypeName` `:42`; `CompareSchemaShapes` +compares it inside `CanonicalSchemaMember` `:605-629`. Numeric-ness is +declared and persisted today, and the claim holds. + +**Two corrections to the estimate.** First, `IsNumeric` has two possible +authorities — the CLR `MemberType` in hand and the `TypeName` string read +back from a stored catalog. They must agree, or a schema validates one way +locally and another way against a persisted catalog. **The CLR set is the +authority** (a closed set: the eight integer types, `float`, `double`, +`decimal`, and `Nullable` over any of them); the string set is generated +from it by `CultSchemaTypeNames.FromType`, never hand-written. S22 pins +that. + +Second, and larger: the accessor is not the only thing missing. Per section +1, `IndexAccessors` and `Members` are `internal` and `GameCult.Networking` +is not a friend assembly, so the evaluator cannot read *any* declared +value — string or number — without the reflection the map is deleting. The +cache add is therefore a **public read surface over declared members**, of +which the numeric accessor is one method: +`TryGetIndexValue(object document, string alias, out string? value)`, +`TryGetIndexNumber(object document, string alias, out double value)`, +`ReferencesOf` (D11), and a public member view carrying `IndexAlias`, +`IsReference`, `IsMany`, `IsNumeric` and the target **`Type`** (D9 needs +the type, not the name). Section 14 carries the revised cost. + +**D9. A reference's target set is resolved by the registry at evaluation, +not persisted.** Persisting `TargetSchemaNames` would change the canonical +member shape and every stored catalog's hash for such schemas. Resolving at +evaluation by assignability over registered leaves (`:1506`, `:1828` do +this today) costs nothing and is correct as of the registry in hand. The +catalog's `TargetSchemaName` stays what it is (`null` for an abstract +target) and is not read by the hop. + +The resolution needs a **`Type`**, and `CultDocumentMemberDescriptor` +carries only `TargetSchemaName`, a string that is `null` in exactly the +case that matters. So the public member view exposes the target `Type` +(held already on `PersistedMember.MemberType` / the attribute's +`TargetType`, `CultCache.cs:1069-1070`), and the leaf set is +`AllDescriptors` (public, `:254-255`) filtered by +`target.IsAssignableFrom(d.DocumentType)` — the same predicate +`GetByIndex` uses at `:1506` and store routing at `:1828`. It must be +computed **against the registry at evaluation, not at descriptor build**: +`BuildDescriptor` runs per type as it is registered, and a leaf registered +later would be missing from a set frozen early. A cached set keyed by +target type is legitimate only if it is invalidated by `Refresh()` +(`:257-265`) and by `RegisterDescriptor` (`:381-410`); simplest is not to +cache it. + +**D10. The duplicate-alias refusal is renamed, not invented.** The Aetheria +hiding case turned out to be refused already (section 1: `HiddenMemberMessage` +at `CultCache.cs:937-943`), and two differently-named members sharing one +alias already throw — from `ToDictionary` at `:462-468`, as an +`ArgumentException` that names neither the schema, nor the members, nor the +alias. D10 is to replace that with a rejection in `DiscoverMembers`' +`rejections` list, in the shape of its neighbours: one grouping over +`IndexAlias` beside the two at `:931-943`, one message beside +`DuplicateSlotMessage` / `HiddenMemberMessage`. The behaviour barely +changes; what changes is that the refusal can be read. Nothing in the +selection depends on it — a colliding catalog never registers either way — +so it is in this cut only because the cut is already in this file and the +message is four lines. + +**D11. Many-references are enumerated by the cache, with payloads.** On each +reference member, `ReferencesOf(document) -> IEnumerable<(CultRecordKey target, object? payload)>`: +a `CultRecordRef` yields one; an `IEnumerable>` yields +each with no payload; an `IDictionary, V>` yields each key +with its value. Anything else declared `many` is refused at registration +(`unsupported_reference_shape`), so a declaration the cache cannot walk is +never silently walked as nothing. + +The enumeration reads `ICultRecordRef.Key` (`CultDocumentContracts.cs:92-95`), +which every `CultRecordRef` implements (`:97-99`), so it needs no +generic dispatch. Two shape rules fall out of `ResolveReferenceTarget` +(`CultCache.cs:1100-1113`) and belong in the same refusal: a member +declared `many` whose element type is not a `CultRecordRef<>` and whose +attribute names no `TargetType` has **no resolvable target at all** +(`IsReference` is true only because the attribute exists, and +`TargetSchemaName` is `null` for a reason that is not inheritance); and a +`many` member that is neither `IEnumerable>` nor +`IDictionary, V>` cannot be walked. Both are +`unsupported_reference_shape` at registration. A `many: false` member whose +type is not `CultRecordRef` is the same fault and takes the same +refusal. + **Agreement with our own abandoned prior art** (`ThreadEpiphanyGraphQuery`, Epiphany `5c62a650`, deleted with its host `5f6f2441`): direction and edge kind as data, schema derived — agreed; differs as before (predicate not @@ -320,9 +584,11 @@ Mongo/ES magic-key documents; every string-parsed evaluator surveyed. | `CultMesh.cs:2701-2719, 2838-2858, 2875-2915` | ~20 net | selector construction for peer snapshots and body subscriptions | | `CultMeshSnapshots.cs:139-201, 434-516, 611-623` overlay logic | ~40 net | overlaying caller `schemaIds`/`recordKeys` onto defaults, four times | | **Mesh total** | **≈ 365 gross, ≈ 331 net** | see section 11 for what does not go | +| `packages/cultnet-rs/src/snapshot_query.rs:100-130` | ~31 | the fifth selector engine: the `requested_schemas` / `requested_keys` sets and the two `is_some_and` filters inside `serve_read_only_raw_snapshot` become one `select` over a lowered v0 selection. The duplicate-identity and unregistered-schema refusals (`:90-110`) and the whole `CultNetReadOnlySnapshotPolicy` (`:132-157`, authorization) stay | +| `src/GameCult.Caching/CultCache.cs` | **0** | the cache deletes nothing. The string `Getter`/`GetterNullable` pair (`:1081-1082`) stays: it is what `any_of` compares and what the index maps are built from (`:1858`). The numeric accessor is beside it, not instead of it | | `tests/GameCult.Networking.Tests/NetworkingTests.cs`: `CultNetDatabaseServer_Creates_Filtered_SnapshotResponse` `:3124`, `…_ForCompatibleSchemaAlias` `:3158`, `CultNetDatabaseServer_Creates_Filtered_SubscriptionChange` `:5547`, `…_ForSchemaAlias` `:5601`, `DatabaseSubscription_FiltersLiveChangesByWireSchemaBinding` `:2256`, `…ByRequestedSchemaAlias` `:2310`, and the `projectRecord` lambda in `…AuthorizesRequestAndFiltersSnapshotAndLiveRecords` `:1601-1605` | ~250 | rewritten over v1 selections against the one evaluator (section 10); the rules they pin survive | -**Not deleted in this cut, by ruling (Q-F):** the v0 message classes and +**Not deleted in this cut, by ruling (R-1), and scheduled for deletion on FU-v0's trigger:** the v0 message classes and their three schema files, the v0 arms in `CultNetSchemaMessageSerialization`, and the v0 handling in the two servers — kept as a **lowering**: a v0 request lowers to `Selection { schemas: schemaIds, keys: recordKeys, projection: document }` @@ -351,14 +617,17 @@ They die with the last runtime follow-up. | Add | Owner | Live consumer | Protected invariant | What it replaces | |---|---|---|---|---| +| `src/GameCult.Caching/CultCache.cs`: a **public read surface over declared members** — `CultDocumentDescriptor.DeclaredMembers` (a public view: `MemberName`, `Slot`, `IndexAlias`, `IsName`, `IsReference`, `IsMany`, `IsNumeric`, `TargetType`), `TryGetIndexValue(document, alias, out string?)`, `TryGetIndexNumber(document, alias, out double)`, `ReferencesOf(document, member)` (D11), `ResolveTargetLeaves(targetType)` over `AllDescriptors` (D9) | `GameCult.Caching` | the evaluator; `CultNetDocumentRegistry`; later any runtime-side reader | **the cache owns addressing and its values**; a reader outside the assembly reads declarations and values through one surface instead of reflecting over documents | the reflection loop at `CultNetDocumentRegistry.cs:325-342`, and the absence that forced it | +| `CultCache.cs` registration refusals: one alias-collision rejection beside `:931-943` (D10), one `unsupported_reference_shape` rejection for a `many`/reference member the cache cannot walk (D11) | `GameCult.Caching` | every registering catalog | a declaration the cache cannot read is refused when it is declared, not answered as nothing when it is read | an `ArgumentException` from `ToDictionary` `:462-468` that names nothing; a silent unwalkable reference | | `contracts/cultnet/cultnet.selection.schema.json` (`$id`, referenced by `$ref`), `cultnet.snapshot-request.v1.schema.json`, `cultnet.database-subscribe.v1.schema.json`, `cultnet.snapshot-response-raw.v1.schema.json`; registry entries in `CultNetSchemaRegistry.cs` | CultLib contracts | C#, Rust; TS/Py/Kotlin follow-ups | one published shape of a selection, hand-written like its siblings, pinned by vectors in both runtimes | `schemaIds`/`recordKeys`/`includeSnapshot` as the wire's only selection | -| `src/GameCult.Networking/CultNetSelection.cs`: `CultNetSelection`, `CultNetFieldPredicate`, `CultNetCitation`, `CultNetIncoming`, `CultNetSelectionProjection`, `CultNetRecordRef`, `CultNetRawDocumentHeader`, `CultNetSelectionPage`; `Validate(IReadOnlyList)` (declared aliases and roles, non-empty lists) | `GameCult.Networking` | the three message classes, the evaluator, Mesh | a selection is typed data with one validation | `_projectRecord`, the allowlist pair | +| `src/GameCult.Networking/CultNetSelection.cs`: `CultNetSelection`, `CultNetFieldPredicate`, `CultNetCitation`, `CultNetIncoming`, `CultNetSelectionProjection`, `CultNetRecordRef`, `CultNetRawDocumentHeader`, `CultNetSelectionPage`, **`CultNetEdge`** (`From`, `Role`, `To`, `PayloadEncoding?`, `Payload?`), **`CultNetSelectionOperator`** (`AnyOf`, `Lt`, `Le`, `Ge`, `Gt`, serialised as the `op` string, never as a union); `Validate(IReadOnlyList)` — declared aliases and roles, non-empty lists, exactly one of `values`/`number` per `op`, and every reachable leaf declaring a compared alias declares it numeric | `GameCult.Networking` | the three message classes, the evaluator, Mesh | a selection is typed data with one validation | `_projectRecord`, the allowlist pair | | `src/GameCult.Networking/CultNetSelectionEvaluator.cs`: `Select(cache, descriptors, selection, ordinals, asOf)` → ordered, hopped, cursored, projected page; `Matches(selection, descriptor, key, document)` for a single change; the cursor mint/parse with `cursor_stale` / `cursor_invalid` | `GameCult.Networking` | `CultNetDocumentRegistry` (snapshot), both servers (changes), `Reconcile` | one evaluator; order, snapshot and hop have one owner | the three engines (section 4) | | `CultNetDatabase.LastWriteSequence(schemaId, key)` (a per-key ordinal kept on apply, ~20 lines) | `CultNetDatabase` | the evaluator's order and cursor | a row's ordinal is its last commit's sequence | `storedAt` as the only time | | v1 message classes beside the v0 ones; the v0→`Selection` lowering (one function) | `GameCult.Networking` | both servers | v0 has no engine of its own | — | -| `packages/cultnet-rs/src/selection.rs`: the types (`Serialize`, `Deserialize`, no `untagged`), `Row` trait (`id`, `ordinal`, `values(index)`, `references()`), `RowSet` trait (`declared_indexes`, `declared_roles`), `Malformed`, `select`, cursor mint/parse, `LIMIT_MAX` | `cultnet-rs` | Huginn (section 12), later Rust services | the same evaluator semantics as the reference, pinned by vectors both ways | Huginn's own `select.rs` from the earlier design | +| `packages/cultnet-rs/src/selection.rs`: the types (`Serialize`, `Deserialize`, no `untagged`; `SelectionOperator` an **externally tagged / string** enum, `Edge { from, role, to, payload_encoding, payload }`), `Row` trait (`id`, `ordinal`, `values(index) -> &[String]`, **`number(index) -> Option`**, **`references() -> Vec<(role, RecordRef, Option>)>`**), `RowSet` trait (`declared_indexes`, `declared_roles`, **`is_numeric(schema, index)`**, **`target_leaves(role)`**), `Malformed`, `select`, cursor mint/parse, `LIMIT_MAX` | `cultnet-rs` | Huginn (section 12), later Rust services | the same evaluator semantics as the reference, pinned by vectors both ways | Huginn's own `select.rs` from the earlier design | +| `snapshot_query.rs`: `serve_read_only_raw_snapshot` calls `select` over a lowered v0 selection; the policy check stays where it is | `cultnet-rs` | its existing callers and tests | the fifth engine has no rule of its own | the filter at `:112-125` | | `contracts.rs`: `SnapshotRequestV1`, `DatabaseSubscribeV1`, `SnapshotResponseRawV1` variants | `cultnet-rs` | Huginn's daemon | the wire spelling equals the reference's | — | -| `contracts/cultnet/selection-vectors.cs-written.json` and `selection-vectors.rs-written.json`: a fixture row set (`cultnet.interop-selection-row` document type with declared indexes `kind`, `severity`, `tags[]` and references `parent`, `related[]`), twenty selections, and each selection's expected page as ids + `matched` + `next` presence | tests, both runtimes | `NetworkingTests`, `cultnet-rs/tests/selection.rs` | **vectors written by the reference decode and evaluate identically in Rust, and vectors written by Rust decode and evaluate identically in the reference** | a within-runtime round trip, which pins nothing about parity | +| `contracts/cultnet/selection-vectors.cs-written.json` and `selection-vectors.rs-written.json`: a fixture row set (`cultnet.interop-selection-row` document type; declared indexes `kind`, `severity`, `tags[]` and **`mass` (numeric, declared on the abstract middle type, not on the leaves)**; references `parent`, `related[]` and **`components` (a dictionary keyed by reference with a float payload)** and **`design` (declared target = the abstract middle, resolving to two leaves)**; **two leaf schemas under one abstract middle**, so inheritance, the abstract target, the dictionary edge and the comparison are all exercised by the fixture rather than argued about in prose), **twenty-eight** selections, and each selection's expected page as ordered ids + `matched` + `next` presence + **the expected `edges` with their payload bytes**. The fixture must also carry, because tests depend on it and a loosening that cannot fail is the fixture's defect: a row whose `mass` **equals** a compared number exactly (S16), **three** rows sharing one index value (S23), one edge pointing outside its declared target (S18), two dictionary entries with **different** payload bytes (S19), and a nullable numeric member and a `decimal` one (S22). **Expected to grow** (R-4): it is chosen for coverage now, not pinned as final, and adding rows or selections to it is a normal change | tests, both runtimes | `NetworkingTests`, `cultnet-rs/tests/selection.rs` | **vectors written by the reference decode and evaluate identically in Rust, and vectors written by Rust decode and evaluate identically in the reference** | a within-runtime round trip, which pins nothing about parity | | `contracts/cultnet/interop/cultnet.interop-selection-row.schema.json` | contracts | the vectors | — | — | | `docs/cultnet-selection-cut.md` (this file), a paragraph in `contracts/cultnet/cultnet-distributed-database.md` under "Implemented", and the runtime table row in `docs/runtime-parity-scope.md` | docs | — | describe the live system | — | @@ -367,6 +636,12 @@ No dependency in either runtime (`schemars` is **not** added to Huginn's derived schema for its own request embeds `Selection` through a hand-maintained `JsonSchema` impl in Huginn, not through the substrate — see section 12). No new package, binary, transport, or store format. +**`packages/cultcache-rs` is untouched**: the C# cache change buys the +evaluator a read surface it does not have, and in Rust the row owner +already supplies exactly that through `Row`/`RowSet`. The asymmetry is +real and intended — the reference reads documents the cache owns, Rust +reads rows the consumer owns — and it is the reason the parity obligation +is on the *vectors* and not on the two implementations' shapes. ## 7. Per-file changes (code that exists, anchored; new code by name and rule) @@ -401,6 +676,43 @@ otherwise `Matches` on the changed row; `:294-322` evaluate + authorize + project; `:424-515` deleted. Module doc `:14-18` rewritten: projection is a value on the request. +**`src/GameCult.Caching/CultCache.cs`** (the only cache file this cut +touches): + +- `:112-150` `CultDocumentDescriptor`'s constructor and fields: `Members` + `:149` and `IndexAccessors` `:148` stay `internal`; a **public** + `DeclaredMembers` view and the three value accessors are added beside + them. Do not widen `Members` itself — `CultDocumentMemberDescriptor` is a + mutable internal DTO whose shape `ToCatalogEntry` `:151-176` depends on, + and publishing a mutable descriptor list makes the catalog's shape a + public contract by accident. The public view is a readonly struct or + sealed record built from it. +- `:445-490` `BuildDescriptor`: the alias `ToDictionary` at `:462-468` is + the site of the D10 refusal's *symptom*; the refusal itself belongs in + `DiscoverMembers` so it lands in `rejections` with its neighbours. +- `:838-946` `DiscoverMembers`: two new groupings beside the two at + `:931-943` — one over `IndexAlias` (D10), one over reference shape + (D11) — and two message helpers beside `DuplicateSlotMessage` / + `HiddenMemberMessage`. Nothing in the existing walk changes. +- `:1050-1114` `PersistedMember`: `Getter`/`GetterNullable` `:1081-1082` + untouched; `NumberOf` (non-null exactly for the closed CLR numeric set, + `Nullable` unwrapped) and `ReferencesOf` added beside them; + `MemberType` `:1052` and the attribute's `TargetType` surface through the + public view as the target `Type`. +- `:254-255` `AllDescriptors` is the input to `ResolveTargetLeaves`; the + set is computed per call, not cached, because `Refresh()` `:257-265` and + `RegisterDescriptor` `:381-410` can both add a leaf after any given + descriptor was built. +- `CultSchemaTypeNames.FromType` (`CultSchemaTypeNames.cs:9-31`) is + `internal` and generates the `TypeName` strings; the `IsNumeric` string + set is generated from the CLR set through it, never written by hand + (S22). + +**`packages/cultnet-rs/src/snapshot_query.rs`**: `:100-130` the two +allowlist sets and their filters become one `select` over the lowered +selection; `:64-99` and `:132-157` untouched; `:158-285` +`CultNetRawSnapshotQuery` untouched in this cut and named in Q-M. + **`CultNetSelection.cs`**, **`CultNetSelectionEvaluator.cs`** (new): as section 6. Rules that must die under their own mutation are in section 10. @@ -431,10 +743,16 @@ and the C#-written pattern the QUIC campaign established (`docs/typescript-quic- `CultNetSelectionEvaluator` owns matching, the hop, the order, the snapshot and the cursor; `CultNetSchemaAliasMatching` owns schema identity; `CultNetDatabase` owns a row's ordinal. **The cache owns - addressing**: which names are indexes and which members are references, - and what a value of each is (a string), through `CultIndexAttribute` and - `CultReferenceAttribute` read from `CultDocumentDescriptor`. The - vocabulary reads those declarations and adds none. `packages/cultnet-rs` + addressing and every value of it**: which names are indexes, which + members are references, whether a member is numeric, what leaves a + reference may target, what a row's value at an alias is, and what edges + and payloads a row carries — through `CultIndexAttribute` and + `CultReferenceAttribute`, the persisted `TypeName`, and the public read + surface of section 6. The vocabulary reads those declarations and adds + none: no new attribute, no persisted field, no schema-hash movement, and + no opinion in the evaluator about what a CLR type means. **The evaluator + never reflects over a document**; if it needs something the cache does + not expose, the cache gains a method, not the evaluator a `GetProperty`. `packages/cultnet-rs` is the Rust spelling of the same owner, at wire parity, with the row owner supplying what the cache supplies in C# (`Row`, `RowSet`). - **Inputs.** The cache's rows and descriptors, the shard log's sequences, @@ -453,17 +771,33 @@ and the C#-written pattern the QUIC campaign established (`docs/typescript-quic- `IsSameCultDocumentSchema`, the Mesh `InferSchemaName` and the registry's `MatchesRequestedSchema` are no longer owners of schema identity. - **Forbidden writers.** Neither server may match a record by a rule of its - own; Mesh may not re-filter a page the server answered; nothing may mint a + own; **`serve_read_only_raw_snapshot` may not filter by schema or key** + (its policy is authorization and stays; its allowlist filter goes); Mesh + may not re-filter a page the server answered — a caller *may* verify a + page against expectations it declared before the request + (`CultNetRawSnapshotQuery::accept_response`, which errors rather than + quietly dropping, and so cannot hide a server that answered wrongly), but + no caller may narrow a page and call the narrowed result the answer; + nothing may mint a cursor a caller could construct; nothing may answer a page over a different `asOf` than its cursor's; the evaluator may not read a payload - by path, only declared indexes and references; no type on the wire is - `untagged`; the Rust `select` may not diverge from the reference on any - vector. + by path, only declared indexes and references, **and may not reflect over + a document at all**; **the evaluator may not read the cache's `_indexes` + map or call `GetByIndex`** — those answer a unique-index lookup, not a + predicate (section 1, S23); no rule may consult an edge's payload while + traversing (section 13); nothing outside `GameCult.Caching` may decide + whether a member is numeric or what leaves a target resolves to; no type + on the wire is `untagged`; the Rust `select` may not diverge from the + reference on any vector. - **Shared paths.** The evaluator under snapshot, change, and reconcile; `CultNetSchemaAliasMatching` under every schema match in both assemblies; `ToRawRecord` under snapshot and change; the v0 lowering under both servers. -- **Deletion line.** Commit 1: the shape, the evaluator and the v1 +- **Deletion line.** Commit 0: the cache's public read surface and its two + registration refusals, with S17-S22 green and `GameCult.Networking` + untouched — the cache change is independently true and lands first, so + that if the rest of the cut is cut, the substrate is not left with half a + surface. Commit 1: the shape, the evaluator and the v1 messages beside v0, with the three engines rewired and deleted and the seven tests rewritten — green. Commit 2: `_projectRecord` and the Mesh collapse. Commit 3: Rust. Commit 4: vectors both ways and entries. @@ -471,7 +805,7 @@ and the C#-written pattern the QUIC campaign established (`docs/typescript-quic- - **Where the line to CultMesh falls.** Mesh is a client that builds selections and reads pages; it evaluates nothing. Where Mesh watches a cache locally by name or index (audit sites #2, #4-9, #16-21), it keeps - its own loops until `CultNetDatabase.Watch(Selection)` exists (Q-H). + its own loops until `CultNetDatabase.Watch(Selection)` exists, which is Cut 2 (section 18). ## 9. Parity: what this cut covers, and what the other runtimes do @@ -491,8 +825,11 @@ directions (section 10), not by a round trip inside one runtime. The one runtime that mis-answers today is none: nothing sends v1 to a runtime that does not speak it until its follow-up lands, and a stray v1 is -refused (TS, Kotlin, C#) or dropped (Python). Python's drop is a silence, -not a refusal, and is recorded as the first line of its follow-up. +refused (TS, Kotlin, C#) or dropped (Python). **Python's drop is fixed in +this cut, not in its follow-up** (R-2): after this cut the table's Python +row reads "refuses with `unsupported_schema_version`", and every runtime on +the wire answers an unknown version with something a caller can read. The +build budget gains one Python test run for it. **Follow-ups, recorded with triggers:** @@ -500,9 +837,12 @@ not a refusal, and is recorded as the first line of its follow-up. `Selection` type; `cultmesh-ts` builders. Trigger: the first TypeScript caller that needs a filtered snapshot or subscription (the browser Eve runtime, when it reads pipeline state). Until then TS refuses v1 loudly. -- **FU-Py.** `cultnet-py` and `cultmesh-py`: reply `cultnet.error.v0 - { code: "unsupported_schema_version" }` for an unknown version (five - lines, the honest minimum, may land before the rest); then the v1 +- **FU-Py.** Its first line is **not** a follow-up: by R-2, `cultnet-py` + and `cultmesh-py` reply `cultnet.error.v0 + { code: "unsupported_schema_version" }` for an unknown version **in this + cut** (five lines at `interop_peer.py:360-387` and the delegating path at + `cultmesh_py/server.py:341`, with one test per site that a v1 message + produces a refusal and not an empty list). The rest of FU-Py is the v1 contracts, and the **three** copies of the selector match (`interop_peer.py:110-125`, `cultmesh_py/server.py:449-470`, `cultmesh_py/node.py:1322-1345`) collapsed into one evaluator. Trigger: @@ -513,9 +853,12 @@ not a refusal, and is recorded as the first line of its follow-up. - **FU-v0.** Retire v0's classes, schemas and lowering once FU-TS, FU-Py, FU-Kt have landed and the interop lanes send v1. Trigger: the last of the three. -- **FU-Watch.** `CultNetDatabase.Watch(Selection)` in the reference and the - Mesh collapse it enables (section 11, ≈ −240). Trigger: the first - consumer that watches a question locally, or the operator's call (Q-H). +- **Not a follow-up any more:** `CultNetDatabase.Watch(Selection)` is + **Cut 2**, mapped in section 18 with its own deletes, authority map, + verification and numbers. It lands after this cut. The audit's ≈ 240 + local-watch lines are counted there, and the real figure turned out + larger than the audit's estimate (≈ −378 in Mesh, section 18.3), because + the audit did not count the nine `Collection*` overloads as selection. `docs/runtime-parity-scope.md`'s table gains, per runtime, "typed selection v1: C# and Rust claimed; TS, Python, Kotlin not claimed (refuse / refuse / @@ -523,8 +866,11 @@ drop)". The claim is written where the parity claims live, not here alone. ## 10. Verification -**Builds.** `dotnet build` of `GameCult.Networking`, `GameCult.Mesh` and -their test projects; `cargo test -p cultnet-rs`; the TypeScript workspace +**Builds.** `dotnet build` of `GameCult.Caching`, `GameCult.Networking`, +`GameCult.Mesh` and their test projects — the cache is now in the build +budget, and it is the assembly the rest of CultLib depends on, so +`dotnet test tests/GameCult.Caching.Tests` is the gate on commit 0 and runs +on every later commit; `cargo test -p cultnet-rs`; the TypeScript workspace untouched but `npm run test --workspace packages/cultnet-ts` run once to prove the interop lane still passes on v0. Host = target = workstation for C# and Rust; no native code. Nothing cleaned. @@ -549,8 +895,31 @@ a loosening where one exists.** | S13 (Rust) | `selection_is_never_untagged` (grep over `packages/cultnet-rs/src` for `untagged`, empty) and `selection_round_trips_named_and_positional` (both encodings) | the encoding rule | an `untagged` shape added | — | | S14 (Rust) | `select_over_a_toy_row_set_matches_orders_hops_pages_and_refuses` | D7, no CultCache knowledge in the evaluator | as S1-S8 | as S1-S8 | | S15 | `Mesh_ReadsASnapshotPageWithoutReFilteringIt` (Mesh tests) | the client trusts the page | the four-tier fallback restored | schema re-filter restored | +| S16 | `Evaluator_ComparesNumbersAtTheBoundaryForEachOfTheFourOperators` | D8's operators; one operator per predicate; two predicates make a range | the comparison ignored (every row matches) | `le` evaluated as `lt` (and `ge` as `gt`) — **kills only if the fixture carries a row whose `mass` equals the compared number exactly**; the fixture must, and if it does not, that is the fixture's defect, not licence to mutate something easier | +| S17 | `Evaluator_AppliesAnInheritedAliasToEveryReachableLeaf` | the inheritance rule; the cache's `BaseType` walk reaching the evaluator | the walk stopped at the leaf (`CultCache.cs:847`) — kills S17 and S12 together | "reachable" narrowed from *every* leaf matching `schemas` to the first descriptor consulted, so a two-leaf selection on an alias declared only on the abstract middle answers with one leaf's rows and no refusal — **requires the fixture to declare `mass` only on the middle and to carry rows of both leaves** | +| S18 | `Evaluator_ResolvesAnAbstractTargetToItsLeavesAndRefusesAnEdgeOutsideThem` | D9; the typed `reference_outside_target` | the target set taken as `{TargetSchemaName}`, which is `null` for an abstract target, so the hop follows nothing | the out-of-target edge **skipped** instead of refused — the option section 3 rejected, and the mutant that proves the rejection is load-bearing; **requires the fixture to carry one edge pointing at a schema outside the declared target** | +| S19 | `Cache_EnumeratesADictionaryReferenceAsEdgesCarryingItsValues` (cache tests) | D11 | `ReferencesOf` yields nothing for a dictionary — today's behaviour, restored | the keys enumerated and the **values dropped** (`payload` null), which is the shape a careless `IEnumerable` implementation would have; **requires two dictionary entries with different payload bytes**, or the assertion passes on shape alone | +| S20 | `Evaluator_ReturnsTraversedEdgesOnlyForHoppingSelections_AndNoPayloadUnderHeader` | the `edges` rule | `edges` never emitted | payload carried under `header`; and, separately, `edges` emitted for a selection with neither `cites` nor `cited` — a widening rather than a loosening, and killed by the same test | +| S21 | `Cache_RefusesADuplicateIndexAliasAndAnUnwalkableReferenceByName` (cache tests) | D10, D11's shape rule | the rejections removed — **kills only if the test asserts the message names the schema, the two members and the alias**, since without them `ToDictionary` still throws an `ArgumentException` and a shallow `Assert.Throws` passes either way. That is the entire content of D10 | the alias grouping keyed by `MemberName` instead of `IndexAlias`, which refuses nothing the existing `HiddenMemberMessage` (`:937-943`) did not already refuse | +| S23 | `Evaluator_MatchesEveryRowSharingAnIndexValue_NotTheCacheIndexWinner` | the evaluator reads values per row, never `_indexes` / `GetByIndex` | the predicate answered from `GetByIndex`, so an `any_of` over a value **three** fixture rows share answers with one | the per-row read kept but short-circuited after the first match when `matched` is all the caller asked for — a plausible optimisation that makes `matched` a boolean in disguise; **requires three rows sharing one index value**, which the fixture must carry | +| S22 | `Cache_DerivesIsNumericFromTheClrSetAndTheTypeNameSetAgrees` (cache tests) | D8's two authorities agreeing | `IsNumeric` true for every member, so a comparison on a string alias validates and compares `ToString()` lexically | the `TypeName`-string set hand-written and missing `System.Nullable` or `System.Decimal`, so a member is numeric against the live descriptor and non-numeric against the same schema read back from a persisted catalog — **requires the fixture to declare a nullable numeric member and a `decimal` one** | -**Negative greps:** `rg -n "untagged" packages/cultnet-rs/src packages/cultcache-rs/src` +**On the parity vectors and the four findings.** S12 is not a new test but +a widened one: the fixture of section 6 carries the abstract middle, the +two leaves, the inherited numeric alias, the dictionary reference with +float payloads and the abstract-target reference, and the vector set +includes at least one selection per finding — a comparison on the +inherited alias, a hop into the abstract target, a hop over the dictionary +returning payloads, and the same hop under `header`. Both directions: +**vectors written by the reference are evaluated in Rust, and vectors +written by Rust are evaluated by the reference**. A round trip inside one +runtime pins nothing and is not counted. The Rust side's fixture rows +implement `Row` over the same declared values, so the vectors test the +*semantics* both ways while each runtime keeps its own source of rows. + +**Negative greps:** `rg -n "GetProperty|GetField|GetCustomAttribute" src/GameCult.Networking` +empty (the evaluator reflects over nothing); +`rg -n "untagged" packages/cultnet-rs/src packages/cultcache-rs/src` empty; `rg -n "InferSchemaName" src/GameCult.Mesh` empty and `src/GameCult.Networking` only in `CultNetSchemaAliasMatching` and the registry's payload-schema resolution; `rg -n "MatchesRequestedSchema|MatchesSchema\(" src` @@ -559,8 +928,10 @@ empty; `rg -n "_projectRecord|projectRecord" src` empty; allowlist pair assembled by hand); `rg -n "CloneSnapshot(Facade)?RequestOptions" src` at most one. **Mutations.** `tools`-style entries in `scripts/mutate-cultmesh.mjs`'s -format with two new targets, `networking` (killer `dotnet test -tests/GameCult.Networking.Tests`) and `rust` (killer `cargo test -p cultnet-rs`), +format with three new targets, `caching` (killer `dotnet test +tests/GameCult.Caching.Tests`, carrying S19, S21 and S22), `networking` +(killer `dotnet test tests/GameCult.Networking.Tests`) and `rust` (killer +`cargo test -p cultnet-rs`), one entry per rule above with revert and loosening; the runner's byte-rewrite/verified-restore discipline applies unchanged. The runner is the QUIC campaign's file and is dirty in the tree; **this campaign adds its @@ -590,7 +961,7 @@ collapses is what has a replacement in this cut. | Peer snapshot / body subscribe selector construction | #10, #14, #15 | 81 | ~61 | −20 | | Snapshot facade overlay logic | #64, #66-70, #72 | ~110 | ~70 | −40 | | **Collapses in this cut** | | | | **≈ −326** | -| Local cache/database watches by name and index and their predicates | #2, #4-9, #16-21 | ≈ 240 | ≈ 240 | 0 now; **≈ −200 under FU-Watch** | +| Local cache/database watches by name and index and their predicates | #2, #4-9, #16-21 | ≈ 240 | ≈ 240 | 0 in this cut; **≈ −378 in Cut 2** (section 18.3 — larger than this audit estimated, because the nine `Collection*` overloads at `CultMesh.cs:2278-2480` were not classified as selection and are) | | Handle catalogs by type/schema, surface catalog, operation payload | #41-49 | 233 | 233 | 0 — these index *handles*, not records | | Verse discovery selection and reshaping | #36, #38 (part), #39, #40, #83, #85 | ~110 | ~110 | 0 — over Verse observations, not documents | | Single-file catalog membership | #58-62 | 81 | 81 | 0 — file-format membership | @@ -598,8 +969,9 @@ collapses is what has a replacement in this cut. | (B) sites | 24 sites | 429 | 429 | 0 by definition | **Plain statement.** `src/GameCult.Mesh` shrinks by about **326 lines of -21,720 (1.5%)** in this cut; a further ≈ 200 collapse only when -`CultNetDatabase.Watch(Selection)` exists (FU-Watch); about 590 of the +21,720 (1.5%)** in this cut, and a further **≈ 378 in Cut 2** — the two +together are about 3.2% of the assembly, and Cut 2 is where the audit's +expectation of a real reduction is met. About 590 of the audit's (A) lines stay because they select handles, Verse observations or file-catalog entries, not database records. The operator's expectation of a net reduction in CultMesh holds, modestly; it does not hold for CultLib as a @@ -633,8 +1005,12 @@ against a `cultnet-rs` dependency Huginn already has):** leaf, and the deletion of `open_items`/`history` with the relation table unchanged (`history(Subject)` = `kinds: [resolution], cites { target, role: subject }`; the open lists = five selections). -- **Dropped from the organ's wire:** `PipelineQuery`, `admitted_after/before` - (Q-G), `QUERY_LIMIT_MAX`. Huginn's `Query { instance, selection }` carries +- **Deleted from the organ's wire (R-3, ruled, not proposed):** + `PipelineQuery`; **`admitted_after` and `admitted_before`**, which existed + only to approximate an order and are replaced by `descending` plus the + cursor — they are a delete in the Huginn cut's own deletes-first table, + with their query-builder call sites, their schema fields and the tests + that pin them, not a deprecation; and `QUERY_LIMIT_MAX`. Huginn's `Query { instance, selection }` carries the substrate's type; its published request schema embeds `Selection` through a hand-maintained `JsonSchema` impl for the `cultnet-rs` types inside Huginn (the substrate publishes JSON, not `schemars`), pinned by the @@ -653,19 +1029,45 @@ paths, sort fields, counts beyond `matched`; a page not tied to `asOf`; selection across shards or minds; a cursor the caller constructs. Each for the reason the earlier specification gave, unchanged. +Named individually, because each has an obvious-looking one-line +implementation and a caller who will ask for it: + +| Not expressible | The obvious ask | Why it is the door | +|---|---|---| +| **A predicate on an edge's payload during traversal** — "components whose quantity is over 4", "demand profile entries weighted above 0.5" | one `if` inside the hop loop, over a payload the evaluator is already holding | **It is a join condition.** The moment a predicate can read a value that belongs to neither the row nor the selection, the evaluator is combining two sources under a condition, and everything that follows is a query planner: which side to drive from, whether to build the incoming-edge index before or after filtering, how `matched` counts a row whose only surviving edge was filtered, what the cursor means when the page is a join result, and whether the payload's type is comparable at all when its declared type differs per leaf. None of that is answerable in a bounded vocabulary. **The caller follows the edge, receives the payload in `edges`, and filters the result** — one extra step for the caller, an entire category of machinery this organ never grows | +| **A set of exact `(schema, key)` pairs** | `keys` already exists; let an entry name its schema | `schemas` × `keys` is a cross product and stays one. `CultNetRawSnapshotQuery` (section 1) shows the cost honestly: it over-requests and verifies. The fix is either a second list shape or a pair type on the wire, and both are the beginning of a term language. A caller who needs exact pairs asks once per schema, or accepts the cross product and verifies against what it declared. Recorded as Q-M, recommendation A: state the limit | +| **A predicate that depends on how many edges a row has** — "hulls with more than three components" | `cited` already counts to one | `exists: true/false` is a boolean, and a threshold is a range over a derived aggregate. Aggregation is a second evaluator with its own ordering and paging semantics | +| **`edges` without rows, or rows the hop excluded** | a `projection: "edges"` | the page's rows are the answer and the edges explain it; an edge-only page is a different question (a graph read) and would need its own order, cursor and bound | + ## 14. Subtraction ledger (estimate) | | Removed | Added | |---|---:|---:| -| `src/GameCult.Networking` | 368 | ~350 (`CultNetSelection` 140, evaluator + cursor 180, ordinals 20, v1 classes and lowering ~40 minus shared) | +| `src/GameCult.Caching` | 0 | **~150**: the public member view ~40, `TryGetIndexValue` / `TryGetIndexNumber` + the CLR numeric set ~35, `ReferencesOf` over the three shapes ~40, `ResolveTargetLeaves` ~10, two rejections with their messages ~20 | +| `src/GameCult.Networking` | 368 | ~400 (`CultNetSelection` + `CultNetEdge` + the operator 170, evaluator + cursor + the incoming-edge index 190, ordinals 20, v1 classes and lowering ~40 minus shared) | | `src/GameCult.Mesh` | ≈ 365 gross | ≈ 40 (one `WithSelection`, one exact read) | -| `packages/cultnet-rs/src` | 0 | ~390 (`selection.rs` 350, `contracts.rs` 40) | +| `packages/cultnet-rs/src` | ~31 (`snapshot_query.rs`'s filter) | ~430 (`selection.rs` 390 with edges and numbers, `contracts.rs` 40) | +| `packages/cultnet-py`, `cultmesh-py` | 0 | ~5 (the `unsupported_schema_version` reply, ruled into this cut) | | `contracts/cultnet` | 0 | 4 schema files (~200 lines JSON), 1 interop row schema, 2 vector files (generated) | -| tests, C# | ~250 rewritten | ~450 (S1-S12, S15, the vector writer) | -| tests, Rust | 0 | ~300 (S12-S14) | -| entries | 0 | ~30 entries | +| tests, C# | ~250 rewritten | ~600 (S1-S12, S15-S18, S20 in Networking; S19, S21, S22 in Caching; the vector writer) | +| tests, Rust | 0 | ~340 (S12-S14 with the edge and number vectors) | +| entries | 0 | ~38 entries across three targets | | docs | — | this map; two paragraphs | -| **net source outside tests** | | **≈ −18 in C#, +390 in Rust; ≈ +370 across the repo** | +| **net source outside tests** | | **≈ +32 in C# Networking, +150 in C# Caching, +399 in Rust; ≈ +585 across the repo** | + +**The estimate moved, and in the wrong direction.** The committed version of +this ledger said ≈ +370 and ≈ −18 in C#. Both were wrong, for one reason: +the map assumed the cache needed no change, and the cache needs about 150 +lines of new public surface before the evaluator can read a single declared +value from outside the assembly (section 1). The honest figure is ≈ +585. +What the repo buys for it is unchanged in kind and larger in size: one +evaluator where **five** stood (three in C#, one in Mesh's re-filter, one +in Rust), a read surface where the substrate's own consumers were +reflecting over documents, edges and their payloads where a declared +reference was unreadable, numeric comparison over a type the catalog has +persisted all along, and a Rust runtime with the capability at all. Nothing +here is a reason to shrink the cut; it is a reason not to claim the cut +shrinks the repo. The repo grows by about 370 source lines for: a typed selection with a derived-by-vector schema where two allowlists were the only language; @@ -679,12 +1081,59 @@ a read that could return the wrong key. ## 15. Build budget -C#: two assemblies and two test projects, debug, workstation. Rust: +C#: **three** assemblies and three test projects (`GameCult.Caching` joins +the budget; it is a dependency of the other two, so touching it rebuilds +them), debug, workstation. Rust: `cultnet-rs` lib + tests, warm target dir, +0 to +60 paths. Nothing cleaned. No native, no TypeScript build beyond one interop-lane run. ## 16. Operator questions, one batch +**Ruled 2026-09-17 and no longer questions.** Four of the batch are +settled; they are recorded here as rulings and carried in the sections +they govern. + +- **R-1 (was Q-F). v0 retires on a named trigger, not "eventually."** The + reference keeps answering v0 by lowering it into a `Selection`, with no + engine of its own. That lowering is a **scheduled deletion**: it is + deleted when FU-TS, FU-Py and FU-Kt have all landed and the interop lanes + send v1, and that is FU-v0's trigger in section 9. A shim with no + deletion date is a permanent shim; this one has a date written as a + condition, and the condition is checkable by grep over the three + runtimes' contract files. Section 4's "not deleted in this cut" row and + section 5's keeps both point here. +- **R-2 (was the second half of Q-F). Python's silent drop is fixed in this + cut.** Every other runtime refuses a message it does not understand; + Python returns `[]` (`interop_peer.py:387`) and the caller reads a hang + rather than a rejection. The five lines that reply `cultnet.error.v0 + { code: "unsupported_schema_version" }` land here, ahead of FU-Py's own + trigger, because a silence is a worse failure than a missing feature. + Carried in section 9's FU-Py entry and section 14's ledger. +- **R-3 (was Q-G). `descending` is the order; the time windows go.** + `admittedAfter` / `admittedBefore` existed to approximate an order the + vocabulary now states outright, and two filters standing in for an order + are worse than the order. They are deleted from Huginn's wire in the + consumer cut (section 12), not kept as an organ-side alias any-of. "The + latest N" is `descending, limit: N`. +- **R-4 (was Q-I). The fixture is chosen for coverage and expected to + grow.** The vector row type is the dedicated + `cultnet.interop-selection-row` family of section 6, shaped to *exercise* + the four hostile findings rather than describe them: shared fields on an + abstract middle with two leaves under it, a reference whose declared + target is that middle, and a many-reference carrying a payload. It is + **not pinned as final** — the fixture is expected to gain rows and + selections as the vocabulary meets more catalogs, and a change to it is a + normal change, not a contract break. What is pinned is the parity + obligation over whatever the fixture holds: both directions, ordered ids, + `matched`, `next` presence, and the edges with their payloads. +- **R-5 (was Q-H). Watching a selection is its own cut, mapped in section + 18 of this document**, after this one and depending on it. Nothing of it + is smuggled into the selection cut and nothing here is designed around it + speculatively; the seam already drawn — one selector type serving both a + query and a subscription — is all this cut owes it. + +**Still open:** + - **Q-A. Leaf `Short` titles for question and ruling** (Huginn/Epiphany). Unchanged: **A, not now** (recommended); B, a leaf follow-up before Cut 13; C, a text projection (Cut 11's question). Depends: the organ's header row @@ -703,36 +1152,47 @@ No native, no TypeScript build beyond one interop-lane run. cannot know a consumer's enums; the organ keeps the typed refusal at its door). Depends: everything in sections 2-10. - **Q-E.** Withdrawn: the seam question is answered by the placement ruling. -- **Q-F. v0's life.** **A, keep v0 answerable in the reference as a - lowering until FU-TS, FU-Py, FU-Kt land** (recommended; the interop CI - witness stays green, and v0 has no engine of its own); B, delete v0 now - and break the three runtimes' lanes; C, add the new fields to v0 — - refused by D3 because Python would mis-answer. Also under Q-F: whether - FU-Py's five-line "reply with `unsupported_schema_version`" lands ahead of - its trigger (recommended yes; it is a refusal where there is a silence). -- **Q-G. `descending` in place of the admission window.** **A** (recommended): - one fixed order, reversible; "the latest N" is `descending, limit: N`; - Huginn's `admitted_after/before` leave its wire. **B**: keep a window as - the one range, on the ordinal only (`sinceOrdinal`), which is a second way - to say what a cursor says. **C**: keep Huginn's date window as an - organ-side alias any-of over `admitted_on` dates — expressible today with - no substrate change, weaker than a range, honest. Depends: Huginn's - filter list; nothing in the substrate. -- **Q-H. `CultNetDatabase.Watch(Selection)` as a named follow-up cut.** - **A, yes, after the runtime follow-ups** (recommended): it is the - "watch a question" affordance the seam was drawn for and the ≈ 200 further - Mesh lines; B, fold into this cut — refused by the coordinator's own - constraint not to design the watch now; C, never — leaves the local - watch helpers as they are. -- **Q-I. Vectors: the fixture row type.** **A, a dedicated - `cultnet.interop-selection-row`** (recommended; declares indexes and - references purposely, both runtimes register it); B, reuse - `cultnet.interop-note` and add index/reference declarations to it — - touches the live interop lane's document. +- **Q-J. Number encoding on the wire.** **A, IEEE float64, with the 2^53 + limit stated in the schema and in this map** (recommended: one encoding, + no parse rule per runtime, and no catalog in hand declares an integer + member wide enough to lose). **B**, decimal strings — exact, but a second + value encoding beside `any_of`'s strings and a per-runtime parse rule, + and two ways to spell a number is how a vocabulary starts growing terms. + **C**, add `integer: int64` beside `number` now, sharing `op` — additive + and untagged-free, and can be added later without breaking A, which is + why adding it now is premature. Depends: the schema files and both + runtimes' predicate types. +- **Q-K. Family names for abstract bases on the wire.** **A, not now** + (recommended): an abstract type has no `[CultDocument]`, no schema name + and no catalog entry, so there is nothing to name; a caller who wants + "every crafted item" enumerates the leaves from the schema catalog it + already reads. **B**, a `[CultDocumentFamily]` declaration plus a catalog + concept plus a matching rule in every runtime, in a later cut. Note this + is only about the `schemas` list: the *hop* already resolves an abstract + target to its leaves (D9), so the hostile example works under A. +- **Q-L. Refusing an out-of-target reference at write time.** **A, + follow-up (FU-Ref)** (recommended): this cut refuses it at read + (`reference_outside_target`, S18), which is where the corruption is + noticed; refusing at write touches the cache's put path and every + runtime's apply path and is a change of a different size. **B**, in this + cut. Under A, the read-side refusal is the only thing standing between a + corrupt edge and a wrong answer, which is why it refuses instead of + skipping. +- **Q-M. The `(schema, key)` cross product.** **A, state the limit** + (recommended): `schemas` × `keys` stays a cross product; a caller needing + exact pairs asks once per schema or verifies what it declared, as + `CultNetRawSnapshotQuery` already does. **B**, allow a `refs: + RecordRef[]` list beside `keys` — expressible without a term language and + genuinely useful, at the cost of a third addressing list and a rule for + how three lists combine. **C**, let a `keys` entry carry a schema — a + path language in miniature, refused. Depends: section 13's table and + `snapshot_query.rs`'s client. What depends on each: S1-S8 on Q-D A; S5 on the shard-log assumption -(section 1) and on Q-B for Huginn; S9 on D6; S10 on Q-F A; S12 on Q-I; -the Huginn cut on Q-B, Q-C, Q-G; FU-Watch on Q-H. +(section 1) and on Q-B for Huginn; S9 on D6; S16 and the schema files on +Q-J; S18 on Q-L A; the Huginn cut on Q-B and Q-C. Settled by R-1 to R-5: +S10, S12, the fixture, FU-v0's trigger, FU-Py's five lines, Huginn's +window deletion, and the watch cut's existence. ## 17. What was probed, read, and not settled @@ -749,3 +1209,244 @@ landing); whether MessagePack-CSharp needs a union attribute for the page's `headers | documents` (it does not if both are optional arrays with exactly one present, which is the spelling chosen so no union is needed — Hands confirms the schema says "exactly one" with `oneOf` over `required`). + +**Read on the second pass, and what it changed.** Each of these was read at +the source, and three of them contradicted something this map or its +predecessor's notes asserted: + +| Read | Held | Changed | +|---|---|---| +| `CultCache.cs:474`, `:151-176`, `:598-629`, `CultSchemaTypeNames.cs:9-31` | **Yes.** A member's type name is derived from the CLR type, persisted in the catalog entry and compared inside the canonical shape. Numeric addressing needs no new declaration, no hash movement and no migration — the load-bearing claim of this whole widening | — | +| `CultCache.cs:112-150` | — | **No.** `Members` and `IndexAccessors` are `internal` with no friend assembly, so the evaluator cannot read a declared value from outside `GameCult.Caching` at all. "No cache change is needed for addressing" was false; the cache add is ~150 lines, not ~60, and the ledger moved from ≈ +370 to ≈ +585 | +| `CultCache.cs:931-943`, `:462-468` | — | **No.** A hiding member is already refused (`HiddenMemberMessage`), and a duplicate alias already throws from `ToDictionary`. D10 shrank from "a missing refusal" to "a refusal that names nothing", and its test only means anything if it asserts the message | +| `packages/cultnet-rs/src/snapshot_query.rs` | — | **No.** Rust has a fifth selector engine (`serve_read_only_raw_snapshot:112-125`) that "Rust: none" concealed, and its client (`:195-217`) shows the cross-product limit that v1 does not fix (Q-M) | +| `CultDocumentContracts.cs:92-99`, `CultCache.cs:1100-1113`, `:1495-1509`, `:1818-1838`, `:254-265` | **Yes.** `ICultRecordRef` is the enumerable handle D11 needs; assignability is already how the cache resolves a base type to concrete documents (D9); `AllDescriptors` is public | — | + +**Still not settled, and who settles it:** + +- Whether every committed write takes a shard-log sequence (unchanged; + Hands, at the append site). +- Whether `CultDocumentDescriptor`'s public member view can be a readonly + struct without forcing an allocation per row per predicate in the + evaluator's inner loop. Nothing here depends on the answer being fast, + but a `Select`-per-row over a fresh list would be a silly cost to build + in; Hands measures if a fixture of a few thousand rows is slow, and not + before. +- The exact split of mutation entries against the QUIC campaign's runner + (unchanged; Self at landing). +- Whether `serve_read_only_raw_snapshot`'s existing tests survive the + lowering unchanged; they should, since the behaviour is identical, but + they were not read line by line. +- Q-J, Q-K, Q-L, Q-M: the operator. + +**Not probed, and deliberately:** nothing was built or run against CultLib. +The tree is hosting a live QUIC campaign, and no claim in this map needs a +build to be true — every one of them is a source read, and the three that +were wrong were wrong because the first pass did not read far enough, not +because a build would have caught them. + +--- + +# Cut 2: watching a selection + +Ruled 2026-09-17 (R-5): the operator wants this and wants it soon, so it is +mapped here rather than left as a follow-up trigger. It is **its own cut**, +landing after Cut 1 and depending on it. Nothing below is smuggled into Cut +1, and Cut 1 is not shaped around it: the seam Cut 1 draws — one selector +type serving a query and a subscription alike — is the whole of what Cut 1 +owes this one. Cut 1 can go to Hands without waiting for a ruling on +anything here. + +Same discipline as Cut 1: facts by source read, deletes first, an authority +map, verification with a mutation per rule including a loosening, and a +subtraction estimate with real numbers. + +## 18.1 Body facts + +**The local watch surface today** (`src/GameCult.Networking/CultNetDatabase.cs`): + +- `Watch()` `:1051-1057` filters the change stream by CLR type; + `WatchAllChanges()` `:1063-1067`; `WatchRecord(key)` `:1072-1075`; + `WatchGlobal()` `:1080-1083`; `WatchByName(name)` `:1088-1094`; + `WatchByIndex(alias, value)` `:1100-1107`. +- **`WatchByName` and `WatchByIndex` do not do what they are named.** Both + read the cache's *current single winner* for the lookup and compare it to + the change's document by `ReferenceEquals`. Combined with section 1's + finding that the cache's index maps hold **one key per value**, this + means `WatchByIndex("kind", "cannon")` observes changes to + whichever single `Weapon` most recently claimed `cannon`, not to the + weapons whose kind is `cannon`. It also re-runs the lookup *at change + time*, so a change that clears the value is evaluated against the state + after the clear. The same two lines exist again in CultMesh as + `MatchesName` / `MatchesIndex` (`CultMesh.cs:3312-3333`). +- The rule is set-dependent even without a hop, and nothing tracks + membership: there is no "was in the set, now is not" anywhere in the + local path. `Reconcile` (`CultNetDatabaseSubscriptionServer.cs:251-292`) + is the only membership tracker in the reference and it belongs to a + server, over a delivered set, per peer. + +**The CultMesh collection surface** (`src/GameCult.Mesh/CultMesh.cs`): nine +`Collection*` overloads at `:2278-2480` — three shapes (all / by name / by +index) by three sources (`CultCache` `:2278`, `:2302`, `:2331`; +`CultNetDatabase` `:2362`, `:2386`, `:2413`; `CultMeshNode` `:2442`, +`:2456`, `:2471`, which delegate to the database trio in three lines each). +`CollectionByIndex` over a cache resolves its contents as +`Optional(cache.GetByIndex(alias, value))` — a "collection" of +**at most one row**, whose live feed then filters by `MatchesIndex`. Three +shapes exist because the shape *is* the query language; a selection +replaces the shape axis entirely and leaves the source axis alone. + +**What Cut 1 leaves in place for this cut:** `CultNetSelection` and its +validation, `CultNetSelectionEvaluator.Matches(selection, descriptor, key, +document)` for a single row, the cache's public read surface, and D6's rule +that a hop-bearing selection is set-dependent and must reconcile rather +than decide per change. + +## 18.2 The shape + +``` +CultNetDatabase.Watch(CultNetSelection selection) + -> Observable + +CultNetSelectionChange { + kind: Entered | Left | Updated // membership, not storage + schemaId, recordKey + document: object? // present on Entered/Updated under `document` projection + previous: object? // present on Left/Updated + cause: Self | Edge // this row changed, or a row it cites / is cited by did +} +``` + +**Rules, each one owner:** + +- **Membership, not mutation.** The stream reports a row entering the + selection, leaving it, or changing while inside it. A write to a row that + was outside and stays outside emits nothing. A write that changes a value + the selection filters on emits `Entered` or `Left`, **not** `Updated` — + which is precisely what `WatchByIndex` cannot express today. +- **`cause: Edge`** is how a hop-bearing selection stays honest: when a + change to row B moves row A in or out, the subscriber is told about A, + with the cause marked, and never about B unless B is itself in the set. +- **No order, no cursor, no `asOf`, no `limit`.** A live feed is not a + page. A selection carrying `limit`, `cursor` or `descending` is **refused + at the door** (`selection_invalid { field }`) rather than silently + ignored: "the latest ten, live" is a different question with a different + answer (it needs an eviction rule), and this cut does not answer it. + `projection` is honoured; `schemas`, `keys`, `fields`, `cites` and + `cited` are honoured. +- **The initial set is not a snapshot message.** `Watch` is local and + in-process; it emits `Entered` for every row already matching, at + subscribe time, under the cache's lock, before any live change. There is + no `asOf` because there is no wire and no second reader. +- **A hop-bearing selection recomputes; a plain one decides per row.** + Without `cites`/`cited`, membership is `Matches(selection, row)` and + costs one row's read. With a hop, a change anywhere can move anything, so + the watch re-evaluates the selection over the cache and diffs against the + membership set it holds. That is O(rows) per change and it is stated + plainly rather than hidden (Q-N). + +## 18.3 Deletes first + +| Path:lines | Lines | What | +|---|---:|---| +| `CultNetDatabase.cs:1080-1107` | 28 | `WatchGlobal`, `WatchByName`, `WatchByIndex` — the three that encode a query in a method name, two of them wrongly. `WatchGlobal` lowers to `keys: ["global:{schemaId}"]`, the other two to a `fields` predicate | +| `CultMesh.cs:3312-3333` | 22 | `MatchesName`, `MatchesIndex` — the same `ReferenceEquals`-against-the-winner rule, second copy | +| `CultMesh.cs:2278-2480` | 203 | the nine `Collection*` overloads; **after: three**, one per source (`CultCache`, `CultNetDatabase`, `CultMeshNode`), each taking a `CultNetSelection`, about 75 lines | +| `CultMeshSnapshots.cs` and `CultMesh.cs` local-watch predicates, audit sites #2, #4-9, #16-21 | ~240 | the remaining local watch loops and their inline predicates, about 40 after | +| **Total** | **~493** | **~115 after; net about −378** | + +`Watch()`, `WatchAllChanges()` and `WatchRecord(key)` **stay**, as +Cut 1's v0 lowering stays: a CLR-type filter and a single-key watch are +conveniences that lower to a selection and have no rule of their own. If +they grow a rule again, W6 catches it. + +## 18.4 Adds and authority + +| Add | Owner | Live consumer | Protected invariant | Replaces | +|---|---|---|---|---| +| `CultNetSelectionWatch` in `GameCult.Networking` (~130 lines): the membership set, the per-change decision, the hop recompute, `CultNetSelectionChange` | `CultNetDatabase` | Mesh's three `Collection` overloads; any local consumer that watches a question | membership is tracked in one place, and a row that leaves the set is reported leaving | `WatchByName` / `WatchByIndex` / `MatchesName` / `MatchesIndex`, four spellings of one wrong rule | +| `CultNetDatabase.Watch(CultNetSelection)` (~15 lines) | `CultNetDatabase` | the above | one entry point | three named-query methods | +| Rust: **nothing in this cut** | — | — | — | no Rust caller watches locally; when one does, it gets the same shape over `Row`/`RowSet` | + +- **Owner.** `CultNetSelectionWatch` owns membership and only membership. + `CultNetSelectionEvaluator.Matches` owns whether a row is in the set — + the watch never re-implements a predicate. `CultNetDatabase` owns the + change stream. The cache owns values, as in Cut 1. +- **Inputs.** The change stream, the cache's rows through the public read + surface, the validated selection. Not inputs: a clock, a transport, the + shard log's sequences (there is no order here), a peer's authorization. +- **Outputs.** `Entered` / `Left` / `Updated` with a cause, and one typed + refusal for a selection carrying page-shaped fields. +- **Derived state.** The membership set, and the incoming-edge index when + the selection hops. **Demotions:** `Watch` and `WatchRecord` are no + longer queries, they are lowerings; Mesh's collection *shape* is no + longer a language, it is a `Selection`; `MatchesIndex` is not an owner of + anything. +- **Forbidden writers.** Nothing outside `CultNetSelectionWatch` may decide + membership; no watch path may call `GetByIndex` or `GetByName` to decide + whether a change is interesting (that is the bug being deleted, in both + its copies); Mesh may not filter a feed the watch answered; the watch may + not emit `Updated` for a row that crossed the predicate boundary; the + watch may not accept `limit`, `cursor` or `descending`. +- **Shared paths.** `Matches` under both the query and the watch — a row + that a page would return and a row the watch reports entering are decided + by the same function, or the two truths drift. The subscription server's + `Reconcile` keeps its own per-peer delivered set (it answers a different + question: what this peer has been told) and **does not** become the local + membership tracker. +- **Deletion line.** Commit 1: `CultNetSelectionWatch` and + `Watch(Selection)`, with the three named-query methods deleted and their + tests rewritten. Commit 2: Mesh's nine overloads collapsed to three, both + matchers deleted. Nothing lands with `WatchByIndex` alive beside it. + +## 18.5 Verification + +| # | Test | Pins | Revert kills | Loosening kills | +|---|---|---|---|---| +| W1 | `Watch_ReportsARowLeavingWhenItsFilteredValueChanges` | membership, not mutation — the bug being deleted | `Left` never emitted (today's behaviour restored: the change is simply not delivered) | `Updated` emitted instead of `Left`, so a subscriber holding a list keeps a row that no longer matches | +| W2 | `Watch_ReportsEveryRowSharingAnIndexValue_NotTheCacheIndexWinner` | the deletion of the `ReferenceEquals`-against-the-winner rule | `MatchesIndex` restored | membership decided by the winner *plus* the changed row, which passes a two-row fixture and fails a three-row one — **the fixture must carry three rows sharing the value** | +| W3 | `Watch_EmitsTheInitialSetBeforeAnyLiveChange` | the subscribe-time set | no initial emission | the initial set emitted *after* the subscription goes live, so a write racing the subscribe is delivered twice or not at all — needs a test that writes between subscribe and first emission | +| W4 | `Watch_ReportsAnEdgeCausedEntryWhenTheCiterChanges` | `cause: Edge`, D6 locally | a hop-bearing watch decided per changed row (the citee never moves) | the citee reported with `cause: Self`, which loses the subscriber's ability to tell a row's own change from a set change | +| W5 | `Watch_RefusesAPageShapedSelection` | no order, cursor or limit on a feed | the refusal dropped and the fields ignored | `limit` refused but `descending` ignored — one field's worth of silent ignoring, which is how a "harmless" ignored field becomes a bug report | +| W6 | `Watch_AndSelect_AgreeOnMembershipForTheSameSelection` (property-shaped: for each fixture selection, the set the watch holds equals the ids a page returns) | the shared `Matches` | the watch given its own predicate | the watch's copy agreeing on the plain selections and differing on the hop-bearing ones — kills only if the fixture's selections include hops, which section 6's fixture does | +| W7 | `Mesh_CollectionTakesASelectionAndFiltersNothingItself` (Mesh tests) | the collapse | an overload restored | the three surviving overloads re-filtering the feed after the watch answered | + +**Negative greps:** `rg -n "WatchByIndex|WatchByName|MatchesIndex|MatchesName" src` +empty; `rg -n "GetByIndex|GetByName" src/GameCult.Mesh src/GameCult.Networking` +empty; `rg -n "CollectionByIndex|CollectionByName" src` empty. + +**Mutations.** Entries in this campaign's own file, target `networking` +(killer `dotnet test tests/GameCult.Networking.Tests`) plus the Mesh tests +for W7, one per rule above with its revert and its loosening. + +## 18.6 Subtraction estimate + +| | Removed | Added | +|---|---:|---:| +| `src/GameCult.Networking` | 28 | ~145 | +| `src/GameCult.Mesh` | ~465 | ~115 | +| tests | ~80 rewritten | ~260 (W1-W7) | +| **net source outside tests** | | **about −233** | + +This is the cut where CultMesh actually shrinks: about −350 in +`CultMesh.cs` and the snapshot facade against about +117 in the database +organ. It is also the cut that deletes a wrong answer rather than a +duplicate one — four spellings of "watch the row that currently wins a +unique-index lookup", replaced by one membership tracker over the selection +the caller actually asked about. Cut 1 pays about +585 for the vocabulary; +Cut 2 spends it. + +## 18.7 Operator questions for this cut + +- **Q-N. The hop-bearing watch's recompute.** **A, recompute and diff on + every change** (recommended: obviously correct, O(rows) per change, and + the local caches this runs over hold thousands of rows, not millions). + **B**, maintain an incremental incoming-edge index invalidated per write + — faster, and a second piece of derived state that can disagree with the + cache. Take B only with a measured reason. +- **Q-O. Does `WatchRecord` survive?** **A, yes, as a lowering** + (recommended; it is one key and no rule). **B**, delete it too and make + every caller say `keys: [k]` — cleaner, noisier at its call sites. +- **Q-P. Ordering on a feed, later.** Out of this cut by the rules above. + If "the latest N, live" is wanted, it is a third cut with an eviction + rule, not a field added here. From 47618428a3210d6342ec5343dc6dd9d9586ab24f Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 01:13:41 +0200 Subject: [PATCH 81/94] Close three questions the map still lists as open The operator ruled ordinals, the two deletions and the leaf titles earlier today, in the other campaign's map. This one still carried them as open, and a stale live question is exactly what a later agent reads as a decision still to make. Co-Authored-By: Claude Fable 5.1 --- docs/cultnet-selection-cut.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/cultnet-selection-cut.md b/docs/cultnet-selection-cut.md index fa144f75..1b8a9469 100644 --- a/docs/cultnet-selection-cut.md +++ b/docs/cultnet-selection-cut.md @@ -1188,6 +1188,14 @@ they govern. path language in miniature, refused. Depends: section 13's table and `snapshot_query.rs`'s client. +**Q-A, Q-B and Q-C are no longer open.** The operator ruled all three on +2026-09-17 and they are recorded in the Huginn campaign's map, +`F:\Projects\Epiphany\notes\eureka-pipeline-state-cut.md`: receipt ordinals +yes; `open_items` and `history` deleted rather than kept as presets; and the +leaf gains titles on `question` and `ruling`, riding the same store version +bump as the ordinal so there is one migration rather than two. They are named +below only because work here still depends on them. + What depends on each: S1-S8 on Q-D A; S5 on the shard-log assumption (section 1) and on Q-B for Huginn; S9 on D6; S16 and the schema files on Q-J; S18 on Q-L A; the Huginn cut on Q-B and Q-C. Settled by R-1 to R-5: From fa6c000e7fcf1fdc80cf3f7a7a4e5e9117e6252a Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 01:19:02 +0200 Subject: [PATCH 82/94] Record the pass where the verdict splits A stranger can now rerun both targets from the committed container and the README, which was the batch's point and holds. The rules are another matter. The scenario holds its callers after the wait whose duration is the rule, so a hard-coded two seconds walks through the whole matrix while the committed entry only ever died because one constant was smaller than another. The gap recorded as unreachable is reachable in fifteen lines against a closed port, and the mutant crashes a plain optimised build on contact. Second gap falsified today. The next batch fixes the cause once instead of adding another entry at another constant. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 73 +++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index 164d51ad..f096ebc1 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -321,8 +321,77 @@ the fix is weaker than the fix: a handle closed under a live call. Both were previously reported killed on the sanitizer target only, and neither has a definition left. The third fix batch is told to give each a real entry or to say plainly that the rule is -undefended, because an honest gap beats a fabricated kill. **Third fix batch -in Hands.** +undefended, because an honest gap beats a fabricated kill. + +**The third fix batch landed** at `62e53df` (the development seam and a +hold-then-close scenario), `e4e09a0` (four entries, the bounded wait at 50 ms, +an exit status on skips, the child's stderr on a red control, re-execution +with randomisation disabled), `12c8bfc` (the header's self-contradiction) and +`4407098` (the committed container, the Ninja generator, the README recipe +with the seccomp requirement). + +**Soul's fourth pass, 2026-09-17** (Fable, banked mid-pass when that model ran +out, resumed on Opus from the bank; the handoff paid for itself by carrying a +live harness process, a dirty tree and two leads the successor opened with). +**The verdict splits, so it is given twice.** + +*The infrastructure question is now yes.* The committed container built with no +cache, then the literal README run line, gives eight killed, none surviving, +none skipped, exit zero on Linux; Windows gives six killed, two honestly +skipped, and a real exit code. A stranger can rerun both targets today. The +seccomp requirement is genuinely load-bearing and the randomisation +re-execution genuinely runs. The development seam is absent from a release +build: thirteen production symbols, no debug symbols, no assertion strings, +and every executable section byte-identical between pre- and post-change +release builds. The predecessor's harness had already exited, restoring the +tree byte-exactly, so the restore path holds. + +*The rules question is still no.* Three of the four rules in the native table +are pinned. The fourth is not, and the cause is structural rather than a bad +constant: + +- **F1, confirmed, high: the hold sits after the wait whose duration is the + rule**, so every timeout mutant lands in a blind spot by construction. + A hard-coded 100 ms survives Windows and Linux with assertions, and dies + under the thread sanitizer only because its slowdown trips an unrelated + condition. **A hard-coded 2000 ms survives the entire matrix on both + targets.** A host asking for five seconds silently gets two and every + consumer's poll loop spins at two and a half times the rate it asked for, + forever. The committed one-millisecond entry dies only because one is less + than the scenario's fifty-millisecond settle: constant pinning constant. +- **F2, confirmed, high: the pop-before-copy gap was wrong about itself.** + A client opening to a closed loopback port reaches that path in about a + millisecond with no listener, credential or connection, because the failure + path always publishes a non-empty reason; fifteen lines. Moving the pop + before the copy then crashes an ordinary optimised build twice out of two, + while both committed scenarios stay green on that same binary. +- **F3, confirmed, medium: the refusal during a close has no entry** and + survives being neutered, though the header promises it. A call entering + behind the closer increments the in-flight count behind the wait, which can + then never reach zero. +- F4, low: the seam misdescribes itself, claiming the held call touches + nothing afterwards when its scope destructor takes the gate, decrements and + notifies. The safety comes from the assertion, not the hold. +- F5, low: the bounded wait at 600 ms survives, the same shape as F1 and + honestly labelled as a limit by Hands. +- Also: "the close wakes every blocked poll" **is** defended by committed code + but has no entry, so the table understates coverage in one place while + overstating it in another. + +**Two scars from the pass itself.** An export made with `git archive` carried +1,459 inserted carriage returns, poisoning any byte comparison built on it; +raw blobs verified against the worktree hash are the only safe source. And the +51 bytes that differ between pre- and post-change release builds are accounted +for: 48 are four copies of the reproducibility content hash, and the last +three sit in exception metadata outside every executable section and **could +not be fully accounted for**, which Soul said rather than rounding away. The +same source rebuilt at the same path twice differs by zero bytes; built +elsewhere it differs by 69, so the figure is only meaningful at a shared path. + +**One undocumented step remains** in an otherwise clean path: the README +hardcodes the container mount, so a newcomer on another checkout must edit the +line. **Fourth fix batch in Hands**, told to fix the structural cause once +rather than add another entry at another constant. **Cut 1 Soul findings, 2026-09-16.** Held: every test count, both negative greps, all twelve mutations rerun and killed, the control catching a From 6e4b9e7eb422e0fd12e1e5d52ffa30acf5e8bd4d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 01:23:44 +0200 Subject: [PATCH 83/94] Rule numbers onto decimal strings Floats are fragile, and every value in this vocabulary is already a string, so decimal strings keep the wire to one value encoding rather than adding a second. The recommendation this reverses had that backwards. What it costs is a comparison rule, and that is where the danger sits: compared as text, ten is less than nine. The cut owes a canonical decimal form and a numeric comparison, both pinned, and it no longer owes anyone a sentence about where exactness runs out. Co-Authored-By: Claude Fable 5.1 --- docs/cultnet-selection-cut.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/cultnet-selection-cut.md b/docs/cultnet-selection-cut.md index 1b8a9469..a488e69d 100644 --- a/docs/cultnet-selection-cut.md +++ b/docs/cultnet-selection-cut.md @@ -1152,7 +1152,22 @@ they govern. cannot know a consumer's enums; the organ keeps the typed refusal at its door). Depends: everything in sections 2-10. - **Q-E.** Withdrawn: the seam question is answered by the placement ruling. -- **Q-J. Number encoding on the wire.** **A, IEEE float64, with the 2^53 +- **Q-J. Number encoding on the wire. RULED B, decimal strings, + 2026-09-17.** The operator: floats are fragile, and strings are the most + reliable way to store a number. **Self's recommendation of A was argued + backwards and the map said so wrongly.** B was framed as "a second value + encoding beside `any_of`'s strings"; it is the opposite. Every value in this + vocabulary is already a string, so decimal strings keep the wire to **one** + value encoding, and it is float64 that would add a second. What B really + costs is a comparison rule, and that is where the danger sits: a decimal + string compared lexicographically answers that ten is less than nine. So + the cut must specify a canonical decimal form and a numeric comparison, + and pin both with mutants — a lexicographic comparison must die, and a + non-canonical spelling of an equal value must not change an answer. Name + the edge cases the canonical form settles: leading and trailing zeros, an + explicit plus, exponent notation, and negative zero. No exactness limit + needs stating, because there is no longer one. + - *Superseded, kept as history:* **A, IEEE float64, with the 2^53 limit stated in the schema and in this map** (recommended: one encoding, no parse rule per runtime, and no catalog in hand declares an integer member wide enough to lose). **B**, decimal strings — exact, but a second From 34df099e8ca4acca079042606a3c51c4d790418a Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 01:30:45 +0200 Subject: [PATCH 84/94] Rule the cross product, and park families for the right reason A caller needing exact pairs asks once per schema. The limit is stated rather than answered with a third addressing list. Naming a family is parked, but not because there is nothing to name. In one process a family is an assignability check; over the wire there is no type system, and nothing publishes the hierarchy where a caller can see it. The fix is a catalog entry naming each leaf's base chain, which is small work that moves the catalog's shape, so it belongs in a cut already touching it. Co-Authored-By: Claude Fable 5.1 --- docs/cultnet-selection-cut.md | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/docs/cultnet-selection-cut.md b/docs/cultnet-selection-cut.md index a488e69d..e79d9721 100644 --- a/docs/cultnet-selection-cut.md +++ b/docs/cultnet-selection-cut.md @@ -1177,8 +1177,22 @@ they govern. and untagged-free, and can be added later without breaking A, which is why adding it now is premature. Depends: the schema files and both runtimes' predicate types. -- **Q-K. Family names for abstract bases on the wire.** **A, not now** - (recommended): an abstract type has no `[CultDocument]`, no schema name +- **Q-K. Family names for abstract bases on the wire. PARKED, 2026-09-17, + and Self's reason was wrong.** The operator: this was possible when + CultCache was a single file, so it is odd that it is hard now; not + load bearing either way. That is correct. In-process a family is one + assignability check, because the runtime holds the hierarchy. Over the + wire there is no type system, only schema names, and an abstract type + carries no `[CultDocument]` so it never gets one. **The hardness is not + modelling, it is that nothing publishes the hierarchy where a remote + caller can see it.** The honest cost is therefore a catalog addition, + each leaf's entry naming its base chain, after which a family is the + leaves whose chain contains the name asked for. Small work — but it moves + the catalog's shape, and this cut's whole claim to being cheap is that it + moves neither the catalog's shape nor its hashes. So it is **deferred to a + cut that is already touching the catalog**, not deferred because there is + nothing to name. Superseded reasoning, kept as history: + an abstract type has no `[CultDocument]`, no schema name and no catalog entry, so there is nothing to name; a caller who wants "every crafted item" enumerates the leaves from the schema catalog it already reads. **B**, a `[CultDocumentFamily]` declaration plus a catalog @@ -1193,7 +1207,11 @@ they govern. cut. Under A, the read-side refusal is the only thing standing between a corrupt edge and a wrong answer, which is why it refuses instead of skipping. -- **Q-M. The `(schema, key)` cross product.** **A, state the limit** +- **Q-M. The `(schema, key)` cross product. RULED A, 2026-09-17**, in the + operator's words: once per schema. The cross product stays, the limit is + stated, and a caller needing exact pairs asks once per schema. No third + addressing list and no rule for combining three of them. + Original options: **A, state the limit** (recommended): `schemas` × `keys` stays a cross product; a caller needing exact pairs asks once per schema or verifies what it declared, as `CultNetRawSnapshotQuery` already does. **B**, allow a `refs: From 2df124e26950a5a11df5147a48249304df3f1a71 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 01:38:24 +0200 Subject: [PATCH 85/94] Name what the generator needs before it can exist A generator runs against published schemas, and the published schema entry is flat: the cache walks the base types to collect members and then throws the hierarchy away. Fed that, a generator emits one flat class per leaf with the inherited members copied into each, which is the opposite of building the hierarchy up for you. So the catalog carrying each leaf's base chain is a prerequisite of that campaign rather than a nicety for naming families, and families fall out of it once it exists. The campaign itself waits until this cut settles the shape it would be generating against. No generator exists in the repository today. Co-Authored-By: Claude Fable 5.1 --- docs/cultnet-selection-cut.md | 38 ++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/docs/cultnet-selection-cut.md b/docs/cultnet-selection-cut.md index e79d9721..83214e87 100644 --- a/docs/cultnet-selection-cut.md +++ b/docs/cultnet-selection-cut.md @@ -1191,7 +1191,43 @@ they govern. the catalog's shape, and this cut's whole claim to being cheap is that it moves neither the catalog's shape nor its hashes. So it is **deferred to a cut that is already touching the catalog**, not deferred because there is - nothing to name. Superseded reasoning, kept as history: + nothing to name. + + **Trigger named, 2026-09-17: the source-generator campaign needs it first.** + The operator's position is that any project using CultNet wants the types it + touches native, and that where the hierarchy is not being declared in + parallel by hand, a generator should build it. That generator runs against + **published schemas**, with C# authoring and the schema as the contract, + which is what the reference-runtime rule already says. + + The obstacle is the same missing fact. `CultCache.cs:847,887,966` walks the + base types while collecting members and then discards the hierarchy, and + `ToCatalogEntry` (`:152-177`) publishes a schema id, the canonical schema, + the compatible ids and a flat member list carrying slot, name, type, + reference-ness, many-ness, target and alias. **Nothing records what a type + inherits from.** So a generator fed published schemas alone emits one flat + class per leaf with the inherited members copied into each — exactly the + hierarchy the operator wants built for them, and unbuildable from what is + published today. + + So the base chain in the catalog is a **prerequisite of the generator + campaign**, and family names fall out of it for free once it exists. Until + then a family expands at the call site into its leaf schema names, which the + generator can emit as a constant, costing the protocol nothing. The honest + limit of call-site expansion, to be stated wherever it lands: it is + closed-world per compilation, so a leaf declared where the caller does not + compile leaves the list silently short, and an open-world caller must ask the + catalog at run time instead. + + The generator is **its own campaign, mapped after this cut lands** (operator, + 2026-09-17: "definitely later"), because its value is emitting against a + shape that is settled and this cut is what settles it. It is also where the + query sugar comes from: typed per-kind builders make filtering a document by + another kind's field a compile error rather than an empty page. **No source + generator exists in CultLib today** — no Roslyn generator anywhere in the + repository, and `src/GameCult.Caching/emitted/` is empty. + + Superseded reasoning, kept as history: an abstract type has no `[CultDocument]`, no schema name and no catalog entry, so there is nothing to name; a caller who wants "every crafted item" enumerates the leaves from the schema catalog it From 122c2172d9c0970b55b85d271bca5a90766b7ea5 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 01:44:09 +0200 Subject: [PATCH 86/94] Rule the reference check onto read now and write later A reference whose target contradicts its declaration is noticed on read in this cut and refused by name. Writing the same check into the put path is intended rather than optional: the declaration already names the target and the writer already holds the record, so it is cheap, and leaving it to consumers means every tool that writes records reimplements it and a tool that forgets looks exactly like one that did not until something refuses. The consumer story rests on less than it sounds. There is no Studio repository and no project by that name; the tooling that enforces this today is one console project in one game. That makes now the cheapest moment to move the rule to its owner. Co-Authored-By: Claude Fable 5.1 --- docs/cultnet-selection-cut.md | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/docs/cultnet-selection-cut.md b/docs/cultnet-selection-cut.md index 83214e87..f21013f5 100644 --- a/docs/cultnet-selection-cut.md +++ b/docs/cultnet-selection-cut.md @@ -1235,8 +1235,33 @@ they govern. concept plus a matching rule in every runtime, in a later cut. Note this is only about the `schemas` list: the *hop* already resolves an abstract target to its leaves (D9), so the hostile example works under A. -- **Q-L. Refusing an out-of-target reference at write time.** **A, - follow-up (FU-Ref)** (recommended): this cut refuses it at read +- **Q-L. Refusing an out-of-target reference at write time. RULED A, + 2026-09-17**, with the follow-up upgraded from optional to intended. The + operator: notice on read for now, but on write eventually; today this is + left to consumers to enforce, as Aetheria's Database Tools did and as + CultCache Studio is expected to, and it is easy to insert garbage at the + source level which a cheap check would prevent. + + **Two things make the follow-up worth more than "nice to have."** First, + enforcement living in consumers is duplicated authority by construction: + every tool that writes records re-implements the same check, and a tool + that forgets is indistinguishable from one that does not, until a read + refuses. Second, the check really is cheap — the declaration already names + the target (`TargetSchemaName` on the member catalog entry), and the write + path already has the record in hand. + + **What Self could establish about the consumer story, 2026-09-17:** it + rests on less than it sounds. There is no CultCache Studio repository + under `F:\Projects`, and no project file by that name anywhere; every + reference to it is forward-looking, in Aetheria's migration documents, + where it is described as absorbing that project's Database Tools. Aetheria's + actual data tooling today is the `tools/AetherDb` console project. So the + enforcement being relied on is one tool, in one project, for one catalog, + and there is no second implementation to be inconsistent with yet — which is + the cheapest moment to move the rule to its owner rather than the most + expensive. + + Original options: **A, follow-up (FU-Ref)** (recommended): this cut refuses it at read (`reference_outside_target`, S18), which is where the corruption is noticed; refusing at write touches the cache's put path and every runtime's apply path and is a change of a different size. **B**, in this From 25d7de26b369f827fe5b8fcb634e1410d4102c15 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 02:09:12 +0200 Subject: [PATCH 87/94] Point the container recipe at whatever checkout is running it The mount was this machine's own path, so the one documented way to build and check the Linux bridge needed editing before it would run anywhere else. It is the repository root now, named as the shell names it. Co-Authored-By: Claude Opus 5 --- native/GameCult.Mesh.Quic.Native/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/native/GameCult.Mesh.Quic.Native/README.md b/native/GameCult.Mesh.Quic.Native/README.md index 4653f86c..92041e8d 100644 --- a/native/GameCult.Mesh.Quic.Native/README.md +++ b/native/GameCult.Mesh.Quic.Native/README.md @@ -110,9 +110,12 @@ mutation harness that drives the runtime-lifetime scenarios is a Node script and a container that cannot run it cannot check the bridge it just built: docker build -t cultlib-quic-native-dev -f scripts/quic-native-linux-dev.Dockerfile scripts - docker run --rm --security-opt seccomp=unconfined -v F:\Projects\CultLib:/src -w /src \ + docker run --rm --security-opt seccomp=unconfined -v "${PWD}:/src" -w /src ` cultlib-quic-native-dev bash -lc "scripts/build-quic-native.sh && node scripts/mutate-cultmesh.mjs native" +Both lines are run from the repository root, and the mount is that root wherever +it is: `${PWD}` in PowerShell, `$(pwd)` in a POSIX shell. + `--security-opt seccomp=unconfined` is load-bearing, not caution. The ThreadSanitizer configuration needs the process's address space where it expects it, so `scripts/mutate-cultmesh.mjs` re-executes those runs under `setarch -R`, From a937a0b07e38a4180ba4e606b3f78f45883f72bc Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 02:09:50 +0200 Subject: [PATCH 88/94] Let the bridge's own timeout, refusal and two-phase poll be seen Three rules the bridge has always promised, none of which anything committed could see. The timeout was the structural one. Both scenarios end their waits with a close, so the duration the bridge waits on governed nothing either of them observes: a hard-coded 2000 ms survived the whole Linux matrix and Windows, and a host asking for five seconds would have got two forever with nothing reporting it. The fix is not another entry at another constant. A timeout's only observable is how long the call takes, so `polltimeout` lets an idle runtime's poll be ended by its own timeout and measures it, twice at different values, because no single constant sits in both bands. The seam's hold moves behind that too: it parks only a call the wait woke, so a poll whose own timeout expired is on its way out rather than held there by the fixture and counted as the bridge's doing. The refusal during a close (the header's section 4) had no scenario at all. A call admitted after the closer has begun increments the in-flight count behind a wait that has already read it. `latecall` holds the close open with the seam and makes a call into it. And the two-phase poll was written off as needing a listener, a credential and a connection. It needs a closed loopback port: the failure always carries a reason, which is an 87-byte payload, in about a millisecond. Moving the pop above the copy crashes on both targets. 18 killed, 0 survived, 0 skipped on linux-x64; 16 killed, 0 survived on win32-x64, where the two ThreadSanitizer entries are honestly skipped. Both runs restored the source to the same sha256, b163cab7d48ebc93. Co-Authored-By: Claude Opus 5 --- .../cultmesh_quic_native.cpp | 20 +- .../tests/cultmesh_quic_native_tests.cpp | 330 +++++++++++++++++- scripts/mutate-cultmesh.mjs | 200 +++++++++-- 3 files changed, 517 insertions(+), 33 deletions(-) diff --git a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp index 621be18c..bfd09afc 100644 --- a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp +++ b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp @@ -83,9 +83,11 @@ // - HELD parks a call inside the library until the scenario releases it, so the // close races calls that are genuinely there for as long as the scenario // wants them there, instead of for as long as the schedule happens to give. -// It returns true when it parked, and touches nothing afterwards: a bridge -// that frees the runtime out from under a held call is then reported by the -// scenario rather than crashing inside it. +// It returns true when it parked, and a held call makes no further call of +// its own; what it does still do is leave its CallScope, which takes the gate, +// decrements the count and notifies. That is the ordinary exit every export +// makes, and it is the bridge's wait — not the hold — that keeps the runtime +// alive underneath it. #if defined(CULTMESH_QUIC_DEBUG_ASSERTS) #define CULTMESH_QUIC_DEBUG_PEAK(count) DebugRaisePeak(count) #define CULTMESH_QUIC_DEBUG_AT_CLOSE(count) DebugRecordCallsAtClose(count) @@ -1172,12 +1174,16 @@ CULTMESH_API int32_t cultmesh_quic_next_event( std::unique_lock lock(runtime->gate); if (runtime->events.empty() && timeout_ms > 0) { - runtime->signal.wait_for(lock, std::chrono::milliseconds(timeout_ms), + // The host's timeout bounds the wait; an event or the close ends it + // sooner, and `woken` is which of the two happened. + const bool woken = runtime->signal.wait_for(lock, std::chrono::milliseconds(timeout_ms), [runtime] { return !runtime->events.empty() || runtime->closing; }); // Development builds only; a no-op unless a scenario has armed the hold. - // A held call returns the same 0 an empty queue would have, and touches - // the runtime no further. - if (CULTMESH_QUIC_DEBUG_HELD(lock)) return 0; + // A held call returns the same 0 an empty queue would have, and makes no + // further call of its own. Only a woken call is held: one whose own + // timeout expired is on its way out, and parking it would let a scenario + // report a call the bridge kept when what kept it was the fixture. + if (woken && CULTMESH_QUIC_DEBUG_HELD(lock)) return 0; } if (runtime->events.empty()) return 0; diff --git a/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp b/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp index 2b2fa3a3..afb529f7 100644 --- a/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp +++ b/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp @@ -19,6 +19,8 @@ // // cultmesh_quic_native_tests closerace [iterations] [pollers] // cultmesh_quic_native_tests holdclose [iterations] [pollers] +// cultmesh_quic_native_tests polltimeout [iterations] +// cultmesh_quic_native_tests latecall [iterations] // // `closerace` hunts the race: many pollers, many iterations, and whatever the // schedule gives. `holdclose` takes the guessing out of it — the bridge's @@ -27,6 +29,12 @@ // bridge actually counted, so the scenario asserts the quiesce instead of // assuming its own fixture worked. It needs CULTMESH_QUIC_DEBUG_ASSERTS. // +// In both of those the wait is ended by the close, so the host's timeout governs +// nothing either of them can see, and a bridge waiting on a constant of its own +// passes both. `polltimeout` is the one that lets the timeout govern the return +// and measures it. `latecall` covers the other half of section 4: a call that +// races the start of a close is refused rather than counted behind its wait. +// // Exit code 0 means every assertion held. Anything else, including a sanitizer // abort or the bridge's own assertion, is a failure. Under ThreadSanitizer run // it with `TSAN_OPTIONS=halt_on_error=1`, or a reported race leaves the exit @@ -34,6 +42,7 @@ #include +#include #include #include #include @@ -139,6 +148,222 @@ std::string CloseRaceOnce(int pollers) { return {}; } +// The two timeouts `polltimeout` asks for. Two, and not one, because a single +// value cannot tell a bridge that honours the host's timeout from one that waits +// on that same number of its own: a constant has to satisfy both bands, and no +// constant is in both. +constexpr int32_t kShortPollMs = 200; +constexpr int32_t kLongPollMs = 900; + +// How much sooner than the timeout a poll may return. A wait may be late; it may +// not be early, because returning early is exactly what waiting on a shorter +// duration looks like. This is scheduler granularity, not slack. +constexpr int kEarlyToleranceMs = 20; + +// How much later than the timeout a poll may return. Wide enough for a loaded +// machine and a container, and narrower than the gap between the two timeouts, +// which is what closes the constant off: 200 admits [180, 500] and 900 admits +// [880, 1200], and nothing is in both. +constexpr int kLateToleranceMs = 300; + +struct TimedPoll { + int32_t result; + long long elapsed_ms; +}; + +TimedPoll PollFor(void* runtime, int32_t timeout_ms) { + std::vector payload(static_cast(kPayloadCapacity)); + cultmesh_quic_event event{}; + int32_t required = 0; + const auto started = std::chrono::steady_clock::now(); + const int32_t result = cultmesh_quic_next_event( + runtime, timeout_ms, &event, payload.data(), kPayloadCapacity, &required); + const auto elapsed = std::chrono::duration_cast( + std::chrono::steady_clock::now() - started).count(); + return {result, elapsed}; +} + +// The host's timeout, and the only thing it is: how long a poll with nothing to +// deliver stays inside the library. Nothing else here checks it — `closerace` +// and `holdclose` both end their waits with a close, so in both of them the +// bridge could wait on any duration at all and every assertion would still hold. +// A runtime with no listener and no connection has nothing to deliver, so the +// timeout is what ends this poll, and the elapsed time is what it waited on. +std::string PollTimeoutOnce() { + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + + std::string failure; + for (const int32_t timeout_ms : {kShortPollMs, kLongPollMs}) { + const TimedPoll poll = PollFor(runtime, timeout_ms); + const std::string asked = "a poll asking for " + std::to_string(timeout_ms) + " ms "; + if (poll.result != 0) { + failure = asked + "returned " + std::to_string(poll.result) + + ", not the 0 an idle runtime owes it"; + break; + } + if (poll.elapsed_ms < timeout_ms - kEarlyToleranceMs) { + failure = asked + "returned after " + std::to_string(poll.elapsed_ms) + + " ms: the wait ended on some shorter duration than the one it was given"; + break; + } + if (poll.elapsed_ms > timeout_ms + kLateToleranceMs) { + failure = asked + "returned after " + std::to_string(poll.elapsed_ms) + + " ms: the wait ended on some longer duration than the one it was given"; + break; + } + } + + cultmesh_quic_runtime_close(runtime); + return failure; +} + +int PollTimeout(int iterations) { + for (int iteration = 0; iteration < iterations; ++iteration) { + const std::string failure = PollTimeoutOnce(); + if (!failure.empty()) + return Fail("polltimeout iteration " + std::to_string(iteration) + ": " + failure); + } + std::printf("polltimeout %dx: ok\n", iterations); + return 0; +} + +// Nothing listens on the discard port, so a connection to it fails and the +// bridge says why. That reason is the payload this scenario needs, and reaching +// it takes no listener, no credential and no established connection. +constexpr uint16_t kClosedPort = 9; + +// How long the failure is given to arrive. The loopback refusal is immediate; +// if the refusal is swallowed instead, MsQuic's own handshake timeout ends the +// connection at 10 seconds and event 4 still arrives, so this only bounds a +// bridge that reports nothing at all. +constexpr int kEventDeadlineMs = 20000; + +// The bridge writes its own reason sentences and every one of them starts here. +// Checking the bytes, and not only the length, is what separates a payload +// copied out of the queued event from one copied out of an event that was popped +// first: the second reads freed memory, which does not spell this. +constexpr char kReasonPrefix[] = "CultMesh QUIC connection"; + +// The two-phase poll, which is the shape every host uses to size its buffer: +// ask with nothing, be told what it needs, ask again. What makes it work is that +// the refusal consumes nothing — the event is still queued, payload and all, +// after a return of 2 — and that the copy happens before the event is popped. +// Both are section 6 of the header, and nothing committed reached either. +std::string PayloadFitOnce() { + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + + std::string failure; + uint64_t connection_id = 0; + const int32_t connecting = + cultmesh_quic_connection_open(runtime, "127.0.0.1", kClosedPort, &connection_id); + if (connecting != 0) { + cultmesh_quic_runtime_close(runtime); + return "cultmesh_quic_connection_open returned " + std::to_string(connecting); + } + + // An out parameter the bridge must not write on a refusal, filled with + // something the bridge never writes so that a write is visible. + cultmesh_quic_event poisoned{}; + std::memset(&poisoned, 0xab, sizeof(poisoned)); + cultmesh_quic_event event = poisoned; + int32_t required = 0; + int32_t result = 0; + + // Ask with no room at all until the event carrying the failure reason + // arrives. An event with no payload fits in nothing, so it is delivered and + // polled past rather than mistaken for this one. + const auto deadline = std::chrono::steady_clock::now() + std::chrono::milliseconds(kEventDeadlineMs); + for (;;) { + event = poisoned; + required = 0; + result = cultmesh_quic_next_event(runtime, 250, &event, nullptr, 0, &required); + if (result == 2 && required > 0) break; + if (result < 0) { + failure = "cultmesh_quic_next_event returned " + std::to_string(result); + break; + } + if (std::chrono::steady_clock::now() >= deadline) { + failure = "no event carrying a payload arrived within " + + std::to_string(kEventDeadlineMs) + " ms of a connection to a closed port"; + break; + } + } + + if (failure.empty() && std::memcmp(&event, &poisoned, sizeof(event)) != 0) + failure = "the refusal wrote to *out_event, which the header says it leaves alone"; + + // Again, with the same empty buffer: a refusal that consumed the event + // leaves nothing to find the second time. + if (failure.empty()) { + cultmesh_quic_event again = poisoned; + int32_t required_again = 0; + const int32_t second = cultmesh_quic_next_event(runtime, 0, &again, nullptr, 0, &required_again); + if (second != 2 || required_again != required) + failure = "the second ask returned " + std::to_string(second) + " needing " + + std::to_string(required_again) + ", not the 2 needing " + std::to_string(required) + + " the first one did: the refusal consumed the event"; + } + + // And with room, which is where the copy happens. The tail beyond the + // payload is written too, so a copy that ran past what it was told to write + // is visible. + if (failure.empty()) { + constexpr uint8_t kTail = 0x5a; + std::vector payload(static_cast(required) + 16, kTail); + cultmesh_quic_event delivered = poisoned; + int32_t required_delivered = 0; + const int32_t third = cultmesh_quic_next_event( + runtime, 0, &delivered, payload.data(), static_cast(payload.size()), + &required_delivered); + const std::string reason(reinterpret_cast(payload.data()), + static_cast(required)); + if (third != 1 || required_delivered != required) + failure = "the ask with room returned " + std::to_string(third) + " needing " + + std::to_string(required_delivered) + ", not the 1 needing " + + std::to_string(required) + " the refusal promised"; + else if (delivered.type != CULTMESH_QUIC_EVENT_CONNECTION_SHUTDOWN || + delivered.connection_id != connection_id || + delivered.payload_length != required) + failure = "the delivered event was type " + std::to_string(delivered.type) + + " on connection " + std::to_string(delivered.connection_id) + " carrying " + + std::to_string(delivered.payload_length) + " byte(s), not the failed connection's own"; + else if (reason.rfind(kReasonPrefix, 0) != 0) + failure = "the payload delivered was '" + reason + "', not a reason this bridge writes"; + else if (payload[static_cast(required)] != kTail) + failure = "the copy wrote past the " + std::to_string(required) + " bytes it reported"; + } + + // Consumed now, and only now. + if (failure.empty()) { + cultmesh_quic_event emptied = poisoned; + int32_t required_emptied = 0; + const int32_t fourth = + cultmesh_quic_next_event(runtime, 0, &emptied, nullptr, 0, &required_emptied); + if (fourth != 0) + failure = "the event was still queued after being delivered: a further ask returned " + + std::to_string(fourth); + } + + cultmesh_quic_runtime_close(runtime); + return failure; +} + +int PayloadFit(int iterations) { + for (int iteration = 0; iteration < iterations; ++iteration) { + const std::string failure = PayloadFitOnce(); + if (!failure.empty()) + return Fail("payloadfit iteration " + std::to_string(iteration) + ": " + failure); + } + std::printf("payloadfit %dx: ok\n", iterations); + return 0; +} + #if defined(CULTMESH_QUIC_DEBUG_ASSERTS) // How long a poll that does not block is given to prove it by returning, after @@ -241,6 +466,98 @@ std::string HoldCloseOnce(int pollers) { return {}; } +// One iteration of the other half of section 4: a call made while a close is +// running is refused, and is not counted behind the close's wait. +// +// The prohibition is the host's — no call may begin after the close starts — and +// the bridge does not make it optional. What it does do is refuse the call that +// races the start, and that refusal is load-bearing rather than courteous: a +// call admitted after the closer has begun increments the in-flight count behind +// a wait that has already read it, and the wait can then be left waiting on a +// count that reaches zero only when the late caller happens to leave. +// +// The seam is what makes the window wide enough to aim at: a held poller keeps +// the close inside its wait for as long as this scenario wants it there. +std::string LateCallOnce() { + cultmesh_quic_debug_hold_calls(1); + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) { + cultmesh_quic_debug_hold_calls(0); + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + } + + std::thread poller([runtime] { + std::vector payload(static_cast(kPayloadCapacity)); + cultmesh_quic_event event{}; + int32_t required = 0; + cultmesh_quic_next_event( + runtime, kPollTimeoutMs, &event, payload.data(), kPayloadCapacity, &required); + }); + + const auto counted_deadline = + std::chrono::steady_clock::now() + std::chrono::milliseconds(kCountedDeadlineMs); + while (cultmesh_quic_debug_peak_calls() < 1 && + std::chrono::steady_clock::now() < counted_deadline) + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + std::this_thread::sleep_for(std::chrono::milliseconds(kSettleMs)); + + std::thread closer([runtime] { cultmesh_quic_runtime_close(runtime); }); + // The close has begun its wait once it has read the count, and the held + // poller is what keeps it there. + const auto started_deadline = + std::chrono::steady_clock::now() + std::chrono::milliseconds(kCountedDeadlineMs); + while (cultmesh_quic_debug_calls_at_close() < 0 && + std::chrono::steady_clock::now() < started_deadline) + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + const int32_t at_close = cultmesh_quic_debug_calls_at_close(); + + // Two calls, from a thread of their own so that a bridge which admits them + // cannot park this one: one that does not block, and then the blocking + // crossing. That order, because a bridge that admits the blocking one parks + // it inside the library until the hold is released, and a call made after + // that would be racing the teardown rather than the wait. + std::atomic late_poll{0}; + std::atomic late_error{0}; + std::thread late([runtime, &late_poll, &late_error] { + std::array message{}; + late_error.store(cultmesh_quic_last_error(runtime, message.data(), + static_cast(message.size()))); + std::vector payload(static_cast(kPayloadCapacity)); + cultmesh_quic_event event{}; + int32_t required = 0; + late_poll.store(cultmesh_quic_next_event( + runtime, kPollTimeoutMs, &event, payload.data(), kPayloadCapacity, &required)); + }); + + std::this_thread::sleep_for(std::chrono::milliseconds(kSettleMs)); + cultmesh_quic_debug_hold_calls(0); + late.join(); + closer.join(); + poller.join(); + + if (at_close < 1) + return "the close did not begin its wait with the poller counted inside, so nothing held it " + "open for a call to race"; + if (late_poll.load() != -1) + return "cultmesh_quic_next_event returned " + std::to_string(late_poll.load()) + + " to a call made during the close, not the -1 that refuses it"; + if (late_error.load() != -1) + return "cultmesh_quic_last_error returned " + std::to_string(late_error.load()) + + " to a call made during the close, not the -1 that refuses it"; + return {}; +} + +int LateCall(int iterations) { + for (int iteration = 0; iteration < iterations; ++iteration) { + const std::string failure = LateCallOnce(); + if (!failure.empty()) + return Fail("latecall iteration " + std::to_string(iteration) + ": " + failure); + } + std::printf("latecall %dx: ok\n", iterations); + return 0; +} + int HoldClose(int iterations, int pollers) { for (int iteration = 0; iteration < iterations; ++iteration) { const std::string failure = HoldCloseOnce(pollers); @@ -267,7 +584,9 @@ int CloseRace(int iterations, int pollers) { int main(int argc, char** argv) { if (argc < 2) { - std::fprintf(stderr, "usage: %s closerace|holdclose [iterations] [pollers]\n", argv[0]); + std::fprintf(stderr, + "usage: %s closerace|holdclose|polltimeout|payloadfit|latecall [iterations] [pollers]\n", + argv[0]); return 2; } const std::string scenario = argv[1]; @@ -278,13 +597,16 @@ int main(int argc, char** argv) { return 2; } if (scenario == "closerace") return CloseRace(iterations, pollers); - if (scenario == "holdclose") { + if (scenario == "polltimeout") return PollTimeout(iterations); + if (scenario == "payloadfit") return PayloadFit(iterations); + if (scenario == "holdclose" || scenario == "latecall") { #if defined(CULTMESH_QUIC_DEBUG_ASSERTS) + if (scenario == "latecall") return LateCall(iterations); return HoldClose(iterations, pollers); #else std::fprintf(stderr, - "holdclose needs the development seam: configure with " - "-DCULTMESH_QUIC_DEBUG_ASSERTS=ON\n"); + "%s needs the development seam: configure with " + "-DCULTMESH_QUIC_DEBUG_ASSERTS=ON\n", scenario.c_str()); return 2; #endif } diff --git a/scripts/mutate-cultmesh.mjs b/scripts/mutate-cultmesh.mjs index c75a9041..ac0711b1 100644 --- a/scripts/mutate-cultmesh.mjs +++ b/scripts/mutate-cultmesh.mjs @@ -47,9 +47,12 @@ // dependencies: // // docker build -t cultlib-quic-native-dev -f scripts/quic-native-linux-dev.Dockerfile scripts -// docker run --rm --security-opt seccomp=unconfined -v F:\Projects\CultLib:/src -w /src \ +// docker run --rm --security-opt seccomp=unconfined -v "${PWD}:/src" -w /src ` // cultlib-quic-native-dev bash -lc "node scripts/mutate-cultmesh.mjs native" // +// Both from the repository root; the mount is that root wherever it is, as +// `${PWD}` in PowerShell or `$(pwd)` in a POSIX shell. +// // The seccomp flag is required, not cautious: the ThreadSanitizer configuration // is re-executed under `setarch -R`, and Docker's default profile denies the // personality call that needs. See `explainUnrunnable` below, and the bridge's @@ -455,11 +458,165 @@ const mutations = [ target: "native", honestOn: ["linux-x64", "win32-x64"], // Still a wait, still the host's timeout in the signature, and the poller is - // gone a millisecond later. A scenario that only sleeps cannot tell. + // gone a millisecond later. This used to die for the wrong reason — 1 ms is + // shorter than `closerace`'s 50 ms settle, so the poller left before the + // close began and the scenario complained about its own fixture. It dies on + // `polltimeout` now, which measures the wait against what was asked for. rule: "a positive timeout blocks until an event or the close (loosening: it waits a token 1 ms)", old: "std::chrono::milliseconds(timeout_ms),", new: "std::chrono::milliseconds(1),", }, + // And the rule underneath that one, which nothing reached until `polltimeout`: + // the duration waited on is the host's, not one of the bridge's own. Both + // scenarios that came before it end their waits with a close, so the timeout + // governed nothing either could see and any constant at all passed them. A + // 2000 ms constant survived the entire Linux matrix and Windows: a host asking + // for five seconds silently got two, and every consumer's poll loop spun at two + // and a half times the rate it asked for. + // + // `polltimeout` asks twice, 200 ms and 900 ms, and measures. That is what makes + // a constant unsurvivable rather than merely unlucky: no single value sits in + // both bands, so the entries below are two sides of one rule and not two + // numbers to be tuned against. + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + rule: "the wait is on the host's timeout (revert: a shorter constant of the bridge's own)", + old: "std::chrono::milliseconds(timeout_ms),", + new: "std::chrono::milliseconds(100),", + }, + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + // The lengthening, which is the half that looks harmless: every poll still + // blocks, every poll still returns, and nothing anywhere reports an error. + rule: "the wait is on the host's timeout (loosening: a longer constant of the bridge's own)", + old: "std::chrono::milliseconds(timeout_ms),", + new: "std::chrono::milliseconds(2000),", + }, + // The close's wake. It was defended by committed code and had no entry, so the + // table understated what `closerace` covers; these say it. + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + rule: "the close wakes every blocked poll (revert: the close marks and waits without waking)", + old: " runtime->signal.notify_all();\n" + + " CULTMESH_QUIC_DEBUG_AT_CLOSE(runtime->active_calls);\n", + new: " CULTMESH_QUIC_DEBUG_AT_CLOSE(runtime->active_calls);\n", + }, + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + // The plausible reading: the wait is for events, so wake it when there are + // events. The wake a close owes has nothing to do with the queue. + // + // Not listed beside it: narrowing `notify_all` to `notify_one`. It survived + // when tried, and it is equivalent rather than uncovered — the first poller + // out notifies all under the gate from its own CallScope destructor, so the + // wake propagates whatever the close asked for. + rule: "the close wakes every blocked poll (loosening: it wakes only when something is queued)", + old: " runtime->signal.notify_all();\n" + + " CULTMESH_QUIC_DEBUG_AT_CLOSE(runtime->active_calls);\n", + new: " if (!runtime->events.empty()) runtime->signal.notify_all();\n" + + " CULTMESH_QUIC_DEBUG_AT_CLOSE(runtime->active_calls);\n", + }, + // Section 4's other half: a call that races the start of a close is refused. + // The header has promised it since it was written and nothing checked it. A + // call admitted instead increments the in-flight count behind a wait that has + // already read it, and that wait can then be left on a count that only reaches + // zero if the late caller happens to leave. + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + rule: "a call racing the start of a close is refused (revert: the scope admits it)", + old: " if (runtime_->closing) return;\n", + new: "", + }, + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + // The reading that sounds conservative: if other calls are still inside, the + // close is waiting for them anyway, so one more can do no harm. It is the + // exact case the refusal exists for. + rule: "a call racing the start of a close is refused (loosening: only when nothing else is inside)", + old: " if (runtime_->closing) return;\n", + new: " if (runtime_->closing && runtime_->active_calls == 0) return;\n", + }, + // The two-phase poll, which is how every host sizes its buffer. Reaching it + // needs no listener, no credential and no established connection: a client + // opening to a closed loopback port is refused in about a millisecond and the + // refusal always carries a non-empty reason, which is an 87-byte payload. + // It was written off as unreachable and is neither unreachable nor safe — + // moving the pop above the copy crashes outright. + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + rule: "a payload that does not fit is refused without being consumed (revert: the refusal pops)", + old: " if (required > payload_capacity) {\n" + + " *out_required = required;\n" + + " return 2;\n" + + " }\n", + new: " if (required > payload_capacity) {\n" + + " *out_required = required;\n" + + " runtime->events.pop_front();\n" + + " return 2;\n" + + " }\n", + }, + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + // The helpful shape: give the caller what fits, tell it what it missed. It + // reports 2, so a host obeying the header asks again — for an event that is + // no longer there. + rule: "a payload that does not fit is refused without being consumed (loosening: it truncates)", + old: " if (required > payload_capacity) {\n" + + " *out_required = required;\n" + + " return 2;\n" + + " }\n", + new: " if (required > payload_capacity) {\n" + + " *out_required = required;\n" + + " *out_event = queued.header;\n" + + " if (payload_capacity > 0 && payload != nullptr)\n" + + " std::memcpy(payload, queued.payload.data(), static_cast(payload_capacity));\n" + + " runtime->events.pop_front();\n" + + " return 2;\n" + + " }\n", + }, + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + rule: "the event is copied before it is popped (revert: the pop moves above the copy)", + old: " *out_event = queued.header;\n" + + " if (required > 0 && payload != nullptr)\n" + + " std::memcpy(payload, queued.payload.data(), static_cast(required));\n" + + " *out_required = required;\n" + + " runtime->events.pop_front();\n", + new: " runtime->events.pop_front();\n" + + " *out_event = queued.header;\n" + + " if (required > 0 && payload != nullptr)\n" + + " std::memcpy(payload, queued.payload.data(), static_cast(required));\n" + + " *out_required = required;\n", + }, + { + target: "native", + honestOn: ["linux-x64", "win32-x64"], + // `queued` is a reference into the deque, and the pop destroys what it names. + // This is the spelling that hides that: the header is copied first, so only + // the payload — the part that is a pointer into a freed vector — is read + // afterwards. Both die; this one dies with the header already correct, which + // is why the payload bytes are checked and not only their length. + rule: "the event is copied before it is popped (loosening: only the payload copy moves after it)", + old: " *out_event = queued.header;\n" + + " if (required > 0 && payload != nullptr)\n" + + " std::memcpy(payload, queued.payload.data(), static_cast(required));\n" + + " *out_required = required;\n" + + " runtime->events.pop_front();\n", + new: " *out_event = queued.header;\n" + + " *out_required = required;\n" + + " runtime->events.pop_front();\n" + + " if (required > 0 && payload != nullptr)\n" + + " std::memcpy(payload, queued.payload.data(), static_cast(required));\n", + }, { target: "native", honestOn: ["linux-x64", "win32-x64"], @@ -516,30 +673,29 @@ function testsPass(workspace) { // ThreadSanitizer build is the only thing that sees a notify land on a destroyed // condition variable, and it exists on linux-x64 alone. // -// `holdclose` runs only where the development seam exists, which is the -// assertion build: it drives the quiesce through that seam rather than through a -// sleep, and it is what kills the rules about counting a host call at all. The -// ThreadSanitizer build deliberately keeps the shipped shape — no assertions, no -// seam — because what it is there for is the race in a library built like the -// one that ships. +// `holdclose` and `latecall` run only where the development seam exists, which +// is the assertion build: they drive the quiesce and the refusal through that +// seam rather than through a sleep, and they are what kill the rules about +// counting a host call at all. The ThreadSanitizer build deliberately keeps the +// shipped shape — no assertions, no seam — because what it is there for is the +// race in a library built like the one that ships. +// +// `polltimeout` measures a wait against the timeout it asked for, so it is run +// only where nothing distorts the clock: a sanitizer's slowdown would make its +// bands meaningless, which is the honest limit of that entry. +const assertScenarios = [ + ["holdclose", "3", "64"], + ["latecall", "5"], + ["polltimeout", "3"], + ["payloadfit", "3"], + ["closerace", "20", "256"], +]; const nativeConfigurations = platform === "linux-x64" ? [ - { - name: "asserts", - asserts: "ON", - sanitizer: null, - scenarios: [["holdclose", "3", "64"], ["closerace", "20", "256"]], - }, + { name: "asserts", asserts: "ON", sanitizer: null, scenarios: assertScenarios }, { name: "tsan", asserts: "OFF", sanitizer: "thread", scenarios: [["closerace", "20", "256"]] }, ] - : [ - { - name: "asserts", - asserts: "ON", - sanitizer: null, - scenarios: [["holdclose", "3", "64"], ["closerace", "20", "256"]], - }, - ]; + : [{ name: "asserts", asserts: "ON", sanitizer: null, scenarios: assertScenarios }]; function msquicArguments() { if (platform === "win32-x64") { From 1845301f91cb40197f817e160258fb903b11e12b Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 02:12:12 +0200 Subject: [PATCH 89/94] Record the batch that made the timeout observable The blind spot was not where the hold sat. No scenario ever let a timeout finish a poll, because both ended their waits with a close, so the duration governed nothing anyone could see. A scenario that polls an idle runtime and measures elapsed against what it asked kills all three constants, and it asks twice at values whose bands do not overlap, because one value cannot tell a bridge honouring the host from one waiting on that same number of its own. The probe that reached the two-phase poll through a closed port is committed, the wake finally has the entry the table had been claiming, and a surviving mutant is argued equivalent and handed to Soul rather than swapped for an easier one. Co-Authored-By: Claude Fable 5.1 --- docs/typescript-quic-realtime-cut.md | 52 ++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md index f096ebc1..83c08ab6 100644 --- a/docs/typescript-quic-realtime-cut.md +++ b/docs/typescript-quic-realtime-cut.md @@ -390,8 +390,56 @@ elsewhere it differs by 69, so the figure is only meaningful at a shared path. **One undocumented step remains** in an otherwise clean path: the README hardcodes the container mount, so a newcomer on another checkout must edit the -line. **Fourth fix batch in Hands**, told to fix the structural cause once -rather than add another entry at another constant. +line. + +**The fourth fix batch landed** at `25d7de2` (the container mount taken from +the running checkout rather than one machine's path) and `a937a0b` (the +scenarios, the seam correction and the new entries). + +**Hands rejected Self's diagnosis and gave a better one.** Self had said the +blind spot was that the hold sat after the wait whose duration was the rule. +The real cause is that **no committed scenario ever let a timeout finish a +poll**: both ended their waits with a close, so the timeout governed nothing +either could observe. The fix is therefore a scenario rather than a seam +recording. `polltimeout` polls an idle runtime and measures elapsed against +what was asked, **at two values with non-overlapping bands** — 200 ms in +[180,500] and 900 ms in [880,1200] — because one value cannot tell a bridge +honouring the host's timeout from one waiting on a constant that happens to +equal it, and no constant lies in both bands. No new export, no header change, +and it works in the shipped shape. + +All three constants now die by that scenario: 100 ms, 600 ms and 2000 ms. The +600 ms case survives both older scenarios and dies to the new one, which is +the demonstration of what the old ones could not see; Hands kept it as a hand +check rather than carrying a third constant in the table. + +Also landed: Soul's closed-port probe committed as `payloadfit`, reaching the +two-phase poll in about a millisecond, where the pop-before-copy mutant +segfaults an optimised Windows build with no sanitizer, five runs of five; an +entry for the refusal of a call racing a close; an entry for the wake, which +the table had been silently failing to claim; and the seam's self-description +corrected, since a held call does leave its scope, which takes the gate, +decrements and notifies. Release shape unchanged on both targets, with no +debug exports and no assertion strings. + +**Tables now: Linux 18 killed, none surviving, none skipped, exit 0. Windows +16 killed, none surviving, two honestly skipped, exit 2.** Controls green on +both. + +**A declared equivalence, handed to Soul rather than substituted.** Changing +the close's wake-all to a wake-one survives, and Hands argues it is equivalent +rather than uncovered, because the first poller out calls wake-all under the +gate from its own scope destructor. It recorded the equivalence beside the +entry and shipped the queue-conditional wake as the loosening instead. This +campaign's fourth encounter with that defect shape, and the first where the +answer was an argued equivalence rather than a swap. + +Named limits: the 600 ms mutant lives only in the report; `payloadfit` and +`polltimeout` run only in the assertion configuration, so the pop-before-copy +kill rests on an unsanitized crash and an exit code rather than an +address-sanitizer configuration the harness still lacks. **Fifth Soul pass in +flight**, asked to settle the rules question and to test the two-band argument +against a mutant that scales or derives its wait rather than replacing it. **Cut 1 Soul findings, 2026-09-16.** Held: every test count, both negative greps, all twelve mutations rerun and killed, the control catching a From 372f10ae8628a6aa6566001bcca8707c1b4e0682 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 02:18:53 +0200 Subject: [PATCH 90/94] Map the cut restoring Studio record grouping and drag-and-drop Imagination pass. Four cuts: inspector model, Studio lowering, release, Aetheria re-pin and annotations. Forks Q1-Q5 await operator rulings. Co-Authored-By: Claude Opus 5 --- docs/studio-grouping-cut.md | 677 ++++++++++++++++++++++++++++++++++++ 1 file changed, 677 insertions(+) create mode 100644 docs/studio-grouping-cut.md diff --git a/docs/studio-grouping-cut.md b/docs/studio-grouping-cut.md new file mode 100644 index 00000000..b9c3207c --- /dev/null +++ b/docs/studio-grouping-cut.md @@ -0,0 +1,677 @@ +# Studio Record Grouping And Reference Drag-Drop Cut + +Date: 2026-09-17 (Imagination pass) + +Status: cut map, forks open. The operator rules on forks Q1-Q5 before Hands +starts. Where a line depends on a fork, it names the fork and follows the +recommendation. Line references are against CultLib `122c217` and Aetheria +`515859cf` unless marked otherwise. + +CultLib `main` moved during this pass, from `122c217` to `1845301`. The three +new commits touch only `native/GameCult.Mesh.Quic.Native`, +`scripts/mutate-cultmesh.mjs` and a QUIC doc. They were live uncommitted edits +in the main checkout when the pass began. The Q5 audit extends to them +unchanged. Another agent is actively working on `main`, so Hands works in its +own worktree. + +## Target + +### Ends + +1. **Declared record grouping.** An attribute on a document type's model + declares that the type's records group by one or more member values. Studio's + record list becomes a foldout tree for that type. Tree levels nest in the + declared order. A declaration on a base type groups the records of every + derived type listed under it. +2. **Create in a group.** Every group node offers `Create`. The new record gets + every grouped member on the path to that node set to that node's value, so + it appears in that node. +3. **Reference drag and drop.** You can drag a record row from Studio's record + list onto any `CultRecordRef` value the inspector draws (a member, a list + element, a dictionary key or value). The drop is accepted exactly when the + record is one the ref's picker would offer. + +Recovered from the legacy "Database Tools" window (Aetheria `d3db1730`, +`Assets/Scripts/CultCache/Editor/DatabaseView.cs`, `AetheriaDatabaseView.cs`, +`Inspectors/DatabaseLinkInspector.cs`). Declaring grouping by selector lambdas +is rejected by operator ruling (2026-09-17): use attributes. + +### Invariants + +- **I1. Model owns grouping.** `CultInspectorModel` alone decides: + - which members group a listed type, and in what order; + - which declarations are invalid, and the notice for each; + - the tree's partition, node identity, node order and node labels; + - the object that create-in-group makes. + The Studio lowers the tree and never reads the attribute, calls + `SetValue` for a preset, or computes a label. +- **I2. The leaves partition the candidates.** Across all leaves, the tree's + records are exactly `RecordCandidates(CultRecordRef, records)`. Each + record appears once, and records keep candidate order inside a leaf. Grouping + never hides a record, including one whose grouped value is unset, dangling, + or an undefined enum value. +- **I3. The listed type owns the tree's shape.** Grouping comes from the type + selected in the type pane, never from each record's runtime type. A + `WeaponItemData` listed under `GearData` is grouped by `GearData`'s + declaration. +- **I4. Node identity is value identity, not the label.** + - A `CultRecordRef` groups by key. + - An enum groups by its underlying value. + - Other kinds group by the invariant string of the value. + So two factions with the same label are two nodes, and foldout state keys on + the node id. +- **I5. Create-in-group round-trips.** Upsert the object that + `CreateInGroup(listed, node)` returns, then regroup: the new record lies in a + node with the same id. +- **I6. One candidate rule.** `IsRecordCandidate(refType, record)` is the only + test for "this record may be this ref's value". `RecordCandidates` filters + through it, and drop acceptance calls it. No `IsInstanceOfType` appears in + `src/GameCult.Unity`. +- **I7. One ref label.** The model owns the strings `None` and `Missing `. + The picker (`DrawRecordRef`) and group labels both use it. +- **I8. Invalid declarations never break the window.** An invalid declaration + gives a flat list plus the model's notice. It never throws in `OnGUI`. +- **I9. A drop honours the same gates as the picker.** A drop is refused: + - in a disabled (read-only) scope; + - when the payload came from another store's model; + - when the key equals the current key. + A dictionary key drop still goes through `ReplaceKey` refusal, because + `DrawDictionary` already routes every key change there + (`CultCacheStudioDrawers.cs:243-251`). + +### Non-consumers and non-goals + +- **Sibling runtimes.** There is no port of the inspector model or the + inspector attributes. + - `packages/cultcache-ts/src/cult-cache-inspector.ts` is a raw + `.cc` byte and catalog dumper (`inspectCultCacheBytes`). It has no members, + metadata, candidates or grouping. + - Rust and Python have neither. + No parity work is needed. +- **Wire and catalog.** Attributes are metadata only. They change no schema id, + catalog entry or store byte. +- **Runtime CultUI panel.** This cut adds none. The model's API is shaped so one + could lower it. +- **Not in scope:** record search (Q4), grouping in the ref picker popup (Q3), + drop-to-append on list headers (the legacy `DatabaseLinkListInspector`), and + the legacy "entry name `New `" on create. + +## Body findings that shape the cut + +Established by reading and by probes in scratch (`probe/`, `studio-compile/`): + +- **F1. Legacy grouping by gear hardpoint read a derived property.** + - Legacy `GearData` grouping read `HardpointType` and wrote `Hardpoint`. + - `EquippableItemData.HardpointType` (`ItemData.cs:401-402`) is an abstract + `[IgnoreMember]` property. `GearData.HardpointType => Hardpoint` + (`:455`), `CargoBayData` returns `Tool` (`:464`) and `HullData` returns + `Hull` (`:533`). + - The stored member is `GearData.Hardpoint` (slot 23, `:453`). + - The model's member list for `GearData` and `WeaponItemData` includes + `Hardpoint#23@GearData`, confirmed by probe. `HardpointType` is not an + inspector member. + - The declaration names `Hardpoint`. The overriding types have no stored + hardpoint, so they have nothing to group. +- **F2. `Manufacturer` is declared on the abstract `ItemData`** (`ItemData.cs:281`), + not on `GearData`. Probe of `GameData/Aetheria.cc` (a copy): + + | Listed type | Records | Manufacturer set | Manufacturer unset | + |---|---|---|---| + | `GearData` (includes `WeaponItemData`) | 43 | 29 | 14 | + | `HullData` | 3 | 3 | 0 | + | `CargoBayData` (includes `DockingBayData`) | 5 | 5 | 0 | + | `SimpleCommodityData` | 13 | 0 | 13 | + | `CompoundCommodityData` | 51 | 0 | 51 | + + `GearData` has 11 distinct manufacturers. A member attribute on + `ItemData.Manufacturer` would therefore also wrap all 64 commodity records in + one "None" level. Legacy grouped only `GearData` by manufacturer. This drives + Q1. +- **F3. Legacy grouping matched the exact type** (`CanGroup: typeof(T) == type`), + and its tables listed exact types. So it never grouped `WeaponItemData` + records. Grouping derived records under a base declaration is new behaviour, + as the brief asks. +- **F4. Legacy create-in-group was dead.** `DatabaseEntryGroup.Activate` + (`DatabaseView.cs:70-75`) throws after invoking. Legacy groups also existed + only when occupied (`GroupBy`), and foldouts keyed on the label's hash, so + groups with the same label collapsed together. +- **F5. Existing metadata misses inherited attributes on overriding properties.** + - `CultInspectorMetadata` reads `member.GetCustomAttributes(true)` + (`CultInspectorModel.cs:36`), and `CultInspectorDrawerClaims.Resolve` reads + it too (`:209`). + - For a `PropertyInfo`, that overload ignores `inherit`. Probe: a base + `[M] abstract int P` is not seen on the override. + `Attribute.GetCustomAttributes(member, true)` does see it. + - Fields are unaffected. This is a latent defect in every `Inherited = true` + inspector attribute. +- **F6. Studio `Add` creates only the listed type** + (`CultCacheStudioWindow.cs:340-347`: `CreateElement(type, type)`), and is + disabled when the model cannot create it (`:141`). + - Create-in-group therefore never makes a derived type, and every grouped + member exists on the created object. + - "A preset value is invalid for the created derived type" cannot arise, so it + is recorded as a default, not a fork. + - An abstract listed type offers no `Create`. +- **F7. Studio search filters the type pane only** (`:112-120`). No record + search exists. +- **F8. Studio foldouts are not persisted.** The inspector keeps foldouts in an + in-memory dictionary (`CultCacheStudioDrawers.cs:33`). The window closes its + store on `OnDisable` (`:48-51`), which includes a domain reload. The only + `EditorPrefs` key is `LastPathKey` (`:13`). +- **F9. No drawer claims `CultRecordRef<>`.** This was checked in CultLib Studio + and in Aetheria `HEAD:Assets/Scripts/Editor/CultCacheDrawers.cs`. So every + ref value reaches `DrawRecordRef` (`:195-221`), and the drop target added + there covers all of them. A future claimed ref drawer would bypass it, which + is acceptable: a claim owns its widget. +- **F10. The Studio editor sources compile outside Unity.** + - Probe: a netstandard2.1 / C# 9 project compiles + `src/GameCult.Unity/Assets/Caching/Editor/*.cs` with 0 errors against: + - `Editor/Data/Managed/UnityEngine/*.dll` from Unity 6000.3.24f1 (the + `UnityEditor.dll` facade must be left out, because it duplicates the + module types); + - the tracked `GameCult.Caching*.dll` and `MessagePack*.dll`. + - This gives a pre-tag compile gate. The last migration only had + post-release Aetheria batchmode. +- **F11. The Studio source row reads its click in `GUILayout.Toggle`** + (`:184`). IMGUI button-like controls take `MouseDrag` while they are the hot + control, so the drag start must be handled on a reserved rect *before* the + toggle draws. This comes from Unity's IMGUI convention and was not probed + here; the operator click-through proves it. + +## Identity, lifecycle and authority + +| Thing | Identity | Lifecycle | Owner (decides) | Readers | Persisted? | +|---|---|---|---|---|---| +| Grouping declaration | Attribute on a document class (Q1-B) or member (Q1-A), in the consumer's engine-free assembly | Compile time; inherited per `AttributeUsage` | Consumer source (Aetheria `ServerShared`) | `CultInspectorModel` only | Source code; no store bytes | +| Resolved grouping (`CultInspectorGrouping`) | Listed `Type` | Cached per model instance, like `_shapes` (`CultInspectorModel.cs:298-299`); dies with the model at store close | `CultInspectorModel` | Studio window | No | +| Group tree (`CultInspectorRecordGroup`) | Root per (listed type, records snapshot) | Rebuilt each `OnGUI`, as `RecordCandidates` already is (`CultCacheStudioWindow.cs:167`) | `CultInspectorModel` | Studio window | No | +| Node id | `` + `/` + per-level value identity (I4) | Stable while the values exist | `CultInspectorModel` | Studio foldout map | No | +| Node label | Enum name, `RecordLabel`, `None`, `Missing `, invariant string, `(empty)` | Recomputed with the tree | `CultInspectorModel` | Studio | No | +| Group foldout state | Node id → bool | Window instance memory; cleared by `CloseStore`; lost on domain reload, which already closes the store (F8) | `CultCacheStudioWindow` | Same | No (default; see Defaults) | +| Invalid-declaration notice | Listed `Type` | With the resolved grouping | `CultInspectorModel` | Studio shows a warning HelpBox above the list | No | +| Created-in-group object | New document | Made by the model, upserted by the window through `_cache.UpsertAsync` exactly as `Add` does | Model makes it; `CultCache` admits it | Window selects the key and expands its path | Store, on `Save` | +| Drag payload | `CultCacheStudioRecordDrag { CultInspectorModel Model; string Key }` under generic data key `"GameCult.CultCacheStudio.Record"` | One drag gesture (Unity `DragAndDrop`) | Studio record list (source) | `CultInspector.DrawRecordRef` (target) | No | +| Drop acceptance | (ref type, record) | Per `DragUpdated` / `DragPerform` | `CultInspectorModel.IsRecordCandidate` plus the I9 gates | Studio | No | + +No persistent state is introduced. No cell is empty. + +## Forks + +### Q1. Where does the grouping declaration live, and how is nesting ordered? (blocks Cuts 1, 4) + +- **A. Member attribute** `[CultInspectorGroup(int order = 0)]` on a field or + property. + - Levels are ordered by `order`, then by the member's display order + (`Metadata.Order ?? Slot`). + - Inheritance comes free. + - The member can't be scoped: on `ItemData.Manufacturer`, it groups every item + type by manufacturer, and all 64 commodity records sit under one `None` + level (F2). + - Ordering spreads across files: `Hardpoint` on `GearData` with `order: 0`, + `Manufacturer` on `ItemData` with `order: 1`. +- **B. Type attribute** `[CultInspectorGroupBy(nameof(Hardpoint), nameof(Manufacturer))]` + on a document class. `AttributeUsage(Class, Inherited = true, + AllowMultiple = false)`. + - The argument order is the nesting order. + - The nearest declaration wins, so a derived type re-declares, and + `[CultInspectorGroupBy]` with no arguments opts out. + - Names resolve against the listed type's inspector members, so inherited + members work. + - `nameof` keeps it refactor-safe, and it names data rather than code. + - It scopes `Manufacturer` to `GearData` exactly as legacy did. +- **C. Both forms.** Twice the surface, two ordering rules. +- **Recommendation: B.** + - It is the only form that recovers the legacy grouping without the + commodity regression. + - Its nesting order sits in one place, readable. + - It is still an attribute, not a selector. + - It departs from the brief's "member attribute" working name; that is why + this is asked. +- **Depends on it:** + - Cut 1's attribute type and its resolution tests. + - Cut 4's annotations: under B, four class attributes; under A, four member + attributes plus accepting F2. + +### Q2. Which group nodes exist? (blocks Cut 1) + +- **A. Occupied values only** (legacy parity, F4). + - Create into an empty category means creating at the root and then editing + the member. +- **B. Enums show every defined value, including empty nodes**, so + create-in-group reaches empty categories. Other kinds show occupied values + only. + - Refs cannot enumerate every candidate record: 11+ factions per level times + the enum levels is too many. +- **Recommendation: A.** + - The trees stay proportional to the data. + - The rule is the same for every kind. + - B is a small later addition. +- **Depends on it:** the tree builder and one test. + +### Q3. Does grouping also apply to the `CultRecordRef` picker popup? (blocks Cut 2 scope) + +- **A. List only.** +- **B. Also the popup**, as `EditorGUILayout.Popup` submenus using `/` paths + built from the ref target type's grouping. + - A label containing `/` would split wrongly unless it is escaped. + - A target type such as `EquippableItemData` has no declaration, so it still + shows flat. +- **Recommendation: A.** + - With drag-drop from the grouped list, the long-popup pain is gone. + - B can reuse the model tree later without new model surface. + +### Q4. Record search? (blocks nothing if A) + +- **A. None in this cut.** The Studio has no record search today (F7). +- **B. A record search field** that filters tree leaves and auto-expands + matching paths. +- **Recommendation: A.** It is a separate feature, and grouping does not need it. + +### Q5. Release base and re-pin scope (blocks Cuts 3, 4) + +`git log a0813c6..122c217` (68 commits) touches nothing under: + +- `src/GameCult.Caching` +- `src/GameCult.Caching.MessagePack` +- `src/GameCult.Unity` +- `unity/` +- `packages/cultmath` + +It touches: + +- the native QUIC bridge, rewritten to a C ABI v2 (`6a091ef`). The v1 exports + `cultmesh_quic_open/state/poll` remain at `cultmesh_quic_native.cpp:1360-1392`. +- OpenSSL MsQuic (`c729dff`). +- TS CultMesh/CultNet, the QUIC native tests, and docs and CI. +- `scripts/build-unity-package.ps1`, one message line. + +The build script rebuilds and, with `-UpdateTemplate`, replaces +`unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/gamecult_mesh_quic_native.dll` +and `msquic.dll`. `19d8d5c` records that the committed native plugin is the +older 40,448-byte Schannel build and that current source builds to 302,080 +bytes. So a release from main ships a new native bridge and msquic into +Aetheria's Unity package. Aetheria calls no QUIC (grep `Quic` in `Assets/Scripts` +hits only a KDTree file). + +- **A. Release from main** after the feature merges, and accept the native + plugin replacement. + - Verify the rebuilt DLL still exports the three v1 entry points the managed + `GameCult.Mesh.Quic.Native.dll` imports + (`src/GameCult.Mesh.Quic.Native/*.cs:261-275`). + - The build host needs MSVC and the pinned MsQuic digests. If the native + build fails, stop and return to the operator. +- **B. Release from a branch off `a0813c6`** carrying only this feature. Tag it + there and merge back to main. + - The tags sit on a commit whose native plugin stays old. + - The next main release takes the drift anyway, so B only defers it. +- **C. Release from main, but hand-restore the old native plugin** in the + release commit. + - The byte check then fails by construction. Rejected unless the operator + wants it. +- **Recommendation: A.** The drift is committed, reviewed work that only the + release step has held back. Aetheria does not load the bridge, and B leaves + the committed plugin already known to be stale (`19d8d5c`). +- **Depends on it:** Cut 3's base, its verification list, and Cut 4's + `CultLibRevision`. + +## Defaults (recorded, not asked) + +- **Group labels:** + - An enum shows `Enum.GetName`. An undefined value shows its number. + - A `CultRecordRef` shows `RecordLabel` of the candidate with that key + (the target's `[CultName]`), so for Faction that is `Name`, not the + legacy `ShortName`. + - An unset ref shows `None`, like the picker (`CultCacheStudioDrawers.cs:207`), + replacing the legacy `Default`. + - A key with no candidate shows `Missing `, as the picker does. + - A string shows its value, or `(empty)`. + - An integer shows its invariant string. + - A bool shows `False`/`True`. +- **Group order within a level:** + - Enums sort by underlying value. + - Refs sort `None` first, then by label (`OrdinalIgnoreCase`, then key), + with `Missing` last. + - Strings sort `OrdinalIgnoreCase`, then ordinal. + - Integers sort numerically; bools sort false before true. +- **Groupable kinds:** String, Integer, Bool, Enum, RecordRef. A grouped member + is refused with a notice and a flat list (I8) when: + - it is of any other kind, including Float, whose bit-equality makes + meaningless groups; + - it is `Hidden`; + - it is read-only (`IsReadOnly`, so a preset cannot assign it and an edit + cannot move the record); + - it is named but is not an inspector member of the listed type; + - it is named twice. +- **Global types are never grouped.** They have one record. +- **Foldouts:** + - Window memory, collapsed by default. + - `CloseStore` clears them. + - Create-in-group, `Add`, and `Duplicate` expand the path to the new + selection, so the selection is always visible. + - No `EditorPrefs` or `SessionState` (F8: a domain reload already closes the + store). +- **Create-in-group into a `Missing ` node** presets the dangling key, which + keeps I5. The record joins the node it was created in. +- **A drop of the current key is rejected** (legacy parity) so that no no-op + commit occurs. +- **F5 is fixed in Cut 1.** The new attribute reads through `MetadataOf`, so + that path must honour inheritance on properties; the fix is one call site + in each of two places. + +## Cuts + +### Cut 1. CultLib model: declaration, grouping tree, candidate and label authority + +- **Repo and branch:** CultLib `claude/studio-grouping`, in a new worktree + `F:\Projects\CultLib-studio-grouping` from `origin/main`. The main checkout + is in active use by the QUIC bridge work; do not use or touch it or the other + worktrees. +- **Deletes and collapses first:** + - `CultInspectorModel.cs:512-520` `RecordCandidates`: its inline predicate + `target.IsInstanceOfType(record.Document) && record.Key.Value.Length > 0` + moves into `IsRecordCandidate`, and `RecordCandidates` filters through it + (I6). + - `CultCacheStudioDrawers.cs:207` builds its `"Missing " + key` / `"None"` + label inline. The label moves to the model (I7), and the Studio call site + changes in Cut 2. + - `CultInspectorModel.cs:36` and `:209` switch from `member.GetCustomAttributes(true)` + to `Attribute.GetCustomAttributes(member, true)` (F5). +- **Adds in `CultInspectorAttributes.cs`:** + - Q1-B: `CultInspectorGroupByAttribute(params string[] members)`, with + `Class`, `Inherited = true`, `AllowMultiple = false`, and property + `Members`. + - Q1-A instead: `CultInspectorGroupAttribute(int order = 0)`, with + `Field|Property`, `Inherited = true`. + - Place it before `CultInspectorDrawerAttribute` (`:80`), with a comment in the + file's style stating the nesting and inheritance rules. +- **Adds in `CultInspectorModel.cs`** (or a sibling `CultInspectorGrouping.cs` + in the same namespace; Hands picks, and one file is preferred while it + stays under ~800 lines): + - `public sealed class CultInspectorGrouping`: `Type ListedType`, + `IReadOnlyList Members` (outermost first), and + `string? Notice`. When `Notice` is set, `Members` is empty. + - `public sealed class CultInspectorRecordGroup`: `string Id`, `string Label` + (empty at the root), `int Depth`, `IReadOnlyList Values` (root to + here), `IReadOnlyList Children`, + `IReadOnlyList Records` (non-empty only at leaves), and + `int Count` (records beneath). + - `CultInspectorModel.GroupingOf(Type listedType)`, cached like `ShapeOf`: + - Global types, and types with no declaration, give empty members and no + notice. + - Q1-B: resolve names against `MembersOf(listedType)`. + - Q1-A: take members carrying the attribute, ordered by (order, display + order). + - Validate the groupable kinds, hidden, read-only and duplicates (Defaults). + - `CultInspectorModel.GroupRecords(Type listedType, IEnumerable records)`: + - The input is `RecordCandidates(CultRecordRef)`, partitioned + level by level by value identity (I4). + - Nodes follow the Defaults order and labels. Records stay in candidate + order (I2). + - With no grouping members, the root holds every record as one leaf. + - `CultInspectorModel.CreateInGroup(Type listedType, CultInspectorRecordGroup group, out string? notice)`: + - Call `CreateElement(listedType, listedType, out notice)`. On null, return + null with that notice. + - Otherwise `SetValue` each grouping member with the node's value. A ref is + rebuilt with `CreateRecordRef(member type, key)`. + - Refuse (`ArgumentException`) a node whose depth or id prefix does not + belong to `listedType`'s current grouping. + - `public bool IsRecordCandidate(Type recordRefType, CultStoredDocument record)`. + - `public string RecordRefLabel(Type recordRefType, object? value, IEnumerable records)`: + - `None` when unset. + - Otherwise `RecordLabel` of the candidate with that key. + - Otherwise `Missing `. +- **Keeps:** `RecordLabel` (`:313-317`), `CreateElement` (`:385-396`), and every other API unchanged. +- **Tests** go in `tests/GameCult.Caching.Tests/CultInspectorModelTests.cs`, + with new fixtures near `:380-459`. Fixtures: + - an abstract base document class, and a derived `[CultDocument]` pair + `GroupBase` / `GroupLeaf : GroupBase`; + - an enum member, a `CultRecordRef` member, a string, a float, + a hidden int and a read-only int; + - a type re-declaring (Q1-B) and a type opting out. + + Each test names the mutation that must turn it red: + + 1. `GroupsNestInDeclaredOrder`. The level order equals the declaration, not + slot order. *Mutation:* order members by slot, and the test fails. + 2. `BaseDeclarationGroupsDerivedRecords`. A `GroupLeaf` record listed under + `GroupBase` is grouped by the base declaration (I3). *Mutation:* look up the + attribute with `inherit: false`, or take the grouping from + `record.Descriptor.DocumentType`. + 3. `NearestDeclarationWinsAndEmptyOptsOut` (Q1-B only). *Mutation:* merge base + and derived name lists. + 4. `LeavesPartitionTheCandidates`. Over records with unset refs, dangling + refs and undefined enum values, the concatenated leaves equal + `RecordCandidates` as a multiset in order (I2). *Mutation:* skip records + whose value is unset, or dedupe by label. + 5. `RefNodesAreKeyedByKeyAndLabelledByTheModel`. Two referenced records share + one `[CultName]` and give two nodes. Unset gives `None`, first. A dangling + key gives `Missing k`, last (I4, I7). *Mutation:* group by label. + 6. `EnumNodesOrderByValue`. Declare the enum out of alphabetical order. + *Mutation:* order nodes by label. + 7. `CreateInGroupPresetsEveryLevelAndRegroupsInPlace`. Create at depth 2, + upsert into a `CultCache` over a temp single-file store, and regroup: the + new record's leaf id equals the node id (I5). *Mutation:* preset only the + deepest level. + 8. `InvalidDeclarationsGiveANoticeAndAFlatTree`. Cover an unknown name, a + float, a hidden member, a read-only member and a duplicate. Each gives a + notice, and `GroupRecords` does not throw (I8). *Mutation:* remove any one + validation branch. + 9. `IsRecordCandidateIsTheRecordCandidatesRule`. A subtype record is + accepted; a sibling type and an empty key are refused; `RecordCandidates` + equals the records filtered by it (I6). *Mutation:* use an exact-type + comparison. + 10. `InheritedMetadataReachesOverridingProperties`. A base abstract property + with `[CultInspectorLabel]` is seen on the override's member metadata + (F5). *Mutation:* revert `:36`. +- **Verification:** + - Run `dotnet test tests\GameCult.Caching.Tests\GameCult.Caching.Tests.csproj -c Release` + in the worktree. All pass, and the count grows by the tests above. + - For each mutation listed, apply it in the worktree, confirm its test fails, + then revert. Record the mutation table in the landing commit message. +- **Ledger:** + - Model: about +150 to 190 lines. + - Attributes: about +15 lines. + - Tests: about +200 lines. + - Two predicate and label duplicates deleted (one moved, one + collapsed in Cut 2). + +### Cut 2. CultLib Studio: lower the tree, create in group, drag source, drop target + +- **Repo and branch:** CultLib `claude/studio-grouping` (same worktree), after + Cut 1. +- **Deletes first:** + - `CultCacheStudioDrawers.cs:207`: the inline `"Missing " + key : "None"` + becomes `Model.RecordRefLabel(type, value, Records)` for `names[0]` when + `index == 0`. + - `CultCacheStudioWindow.cs:180-185`: the flat `foreach` over records is + replaced by tree drawing. +- **Changes in `CultCacheStudioWindow.cs`:** + - Fields (`:13-30`): add `Dictionary _groupFoldouts` + (`StringComparer.Ordinal`) and `const string RecordDragKey`. + `CloseStore` (`:318-327`) clears the foldouts. + - `DrawRecords` (`:135-190`): + - Take `_model.GroupingOf(_selectedType)`. When its `Notice` is set, show a + `HelpBox` Warning above the list. + - Draw `_model.GroupRecords(_selectedType, _records)` recursively. A node + is a foldout labelled `Label (Count)` and indented by `Depth`. + - An expanded node draws its children, then its leaf records, then a + `Create` mini button. The button is enabled under the same + `cannotAdd || IsGlobal` gate as `Add` (`:141-147`) and calls + `CreateInGroup`. + - The root (depth 0) is not drawn as a foldout. `Add` stays the root create. + - Record row: + - Reserve its rect with `GUILayoutUtility.GetRect` before + `GUI.Toggle(rect, ...)` (F11). + - On `MouseDrag` inside the rect with a button held, set + `DragAndDrop.PrepareStartDrag()`, then `SetGenericData(RecordDragKey, + new CultCacheStudioRecordDrag(_model, key))`, set `objectReferences` to + empty, call `StartDrag(label)`, and use the event. + - `AddInGroup(node)`: mirrors `Add` (`:340-347`) through `Run`. It upserts + `CreateInGroup`'s object (null means throw its notice), selects the key, and + expands the node's id prefixes. `Add` and `Duplicate` expand the new + record's path by looking up its leaf in the next tree; Hands may do that + on the next frame through a `_revealKey` field. +- **Changes in `CultCacheStudioDrawers.cs`:** + - Add `internal sealed class CultCacheStudioRecordDrag { Model; Key }`, or + put it in the window file (Hands picks; one type, no interface). + - `DrawRecordRef` (`:195-221`): capture the `HorizontalScope` rect. + - On `DragUpdated` or `DragPerform` inside it, when `GUI.enabled` is true, + the payload's `Model == Model`, the payload key is not the current key, + the key's record is in `Records`, and `Model.IsRecordCandidate(type, + record)` holds, set the visual mode to `Copy`. Otherwise set it to + `Rejected` for our payload only (leave foreign drags untouched). + - On perform: `AcceptDrag`, `next = key`, `GUI.changed = true`, and use + the event. + - Return through the existing `next == key ? value : CreateRecordRef` + (`:220`). +- **README** (`src/GameCult.Unity/Assets/Caching/README.md`, after `:36-39`): + - Grouping: the attribute, nesting, inheritance, labels, create in group, + and the notice. + - Drag a record onto a reference field. + - Under "Inspection Model", the grouping API and `IsRecordCandidate` / + `RecordRefLabel`. +- **Verification:** + - Pre-tag compile gate (F10). Copy the scratch `studio.csproj` pattern: + netstandard2.1, `LangVersion 9.0`, compiling the worktree's + `Assets/Caching/Editor/*.cs`. Reference Unity 6000.3.24f1 + `Editor\Data\Managed\UnityEngine\*.dll` (not `UnityEditor.dll`) and the + worktree's freshly built `src\GameCult.Caching` and + `GameCult.Caching.MessagePack` outputs (`dotnet build -c Release`), plus + the tracked `MessagePack*.dll`. Expect 0 errors. Keep the project in + scratch, not the repo. + - Negative greps in the worktree, each empty: + - `rg -n "IsInstanceOfType" src/GameCult.Unity/Assets/Caching` (I6) + - `rg -n "\"Missing \"|\"None\"" src/GameCult.Unity/Assets/Caching/Editor` (I7) + - `rg -n "SetValue|GetCustomAttribute|CultInspectorGroup" src/GameCult.Unity/Assets/Caching/Editor/CultCacheStudioWindow.cs` (I1) + - `rg -n "EditorPrefs" src/GameCult.Unity/Assets/Caching/Editor` shows only + `LastPathKey` + - Cut 1's tests still pass. + - Operator click-through happens after Cut 4, in Aetheria against the tagged + package, as in the migration's Cut 6 precedent. See Cut 4. +- **Ledger:** Window about +70 to 90 lines, drawers about +25 lines, README + about +20 lines. Two inline decisions deleted. + +### Cut 3. CultLib release: cultlib Unity 1.0.60, Studio 1.4.0 + +- **Repo and branch:** CultLib `main`. Merge `claude/studio-grouping` + (fast-forward or merge commit), then create the release commit in the same + clean worktree. Q5-A is assumed. +- **Files:** + - `unity/org.gamecult.cultlib/package.json:4`: `1.0.59` → `1.0.60`. + - `src/GameCult.Unity/Assets/Caching/package.json:4`: `1.3.1` → `1.4.0`, + because this is new user-facing capability. `:13`: `"org.gamecult.cultlib": "1.0.60"`. + - `unity/org.gamecult.cultlib/Runtime/Plugins/*.dll|pdb` and + `x86_64/*.dll`, via + `powershell -File scripts\build-unity-package.ps1 -UpdateTemplate`. The + script derives the assembly version from the package.json and checks it + (`:150-153`). +- **Tags on the release commit:** `cultlib-unity-v1.0.60` and + `caching-unity-v1.4.0`. That is two tags in one push, under GitHub's + three-tag workflow limit (migration cut map header). No `cultmath-unity` tag, + because CultMath is unchanged. +- **Verification:** + - **Byte check.** Run the build script again and check that + `git status --porcelain unity/` is empty (a reproducible build). This is + manual, as recorded in the migration's follow-ups. + - **Expected diff.** `git diff --stat HEAD~1 -- unity/` lists + `GameCult.Caching.dll/.pdb` changed. Under Q5-A, + `x86_64/gamecult_mesh_quic_native.dll` (about 302 KB) and `msquic.dll` also + change. An unexpected changed assembly stops the release for review. + - **API present.** A throwaway scratch script loads the tracked + `GameCult.Caching.dll` by reflection and confirms that + `CultInspectorGroupByAttribute`, `CultInspectorModel.GroupRecords`, + `CreateInGroup`, `IsRecordCandidate` and `RecordRefLabel` exist. + - **Native ABI (Q5-A).** Run `dumpbin /exports` on the tracked + `gamecult_mesh_quic_native.dll`. It lists `cultmesh_quic_open`, `_state`, + `_poll`, `_error` and `_close`. + - **Tags pushed.** `git ls-remote --tags origin` lists both tags. +- **Ledger:** Versions and binaries only. + +### Cut 4. Aetheria: re-pin CultLib and annotate grouping + +- **Repo and branch:** Aetheria `codex/cultcache-cutover`, the current branch. + Stage by path only: `Assets/Scripts/Editor/CultCacheDrawers.cs` carries an + unrelated uncommitted edit that must stay out of the commit and untouched. +- **Files:** + - `Directory.Build.props:5` `CultLibRevision`: set it to the Cut 3 release + commit's full SHA. Note that it lives in props, not targets; the check is in + `Directory.Build.targets:2-22`. + - `Packages/manifest.json:53`: `#caching-unity-v1.3.1` → `#caching-unity-v1.4.0`. + `:54`: `#cultlib-unity-v1.0.59` → `#cultlib-unity-v1.0.60`. `:55` + `cultmath-unity-v0.2.3` is unchanged. Unity rewrites + `Packages/packages-lock.json`; commit that too. + - `Assets/Scripts/ServerShared/ItemData.cs`, under Q1-B: + - `SimpleCommodityData` (`:300`): `[CultInspectorGroupBy(nameof(Category))]` + - `CompoundCommodityData` (`:330`): `[CultInspectorGroupBy(nameof(Category))]` + - `GearData` (`:449`): `[CultInspectorGroupBy(nameof(Hardpoint), nameof(Manufacturer))]`. + `WeaponItemData` inherits it. + - `HullData` (`:493`): `[CultInspectorGroupBy(nameof(HullType))]` + - Under Q1-A instead: `[CultInspectorGroup]` on `SimpleCommodityData.Category` + (`:309`), `CompoundCommodityData.Category` (`:337`), + `GearData.Hardpoint` (`:453`), `ItemData.Manufacturer` (`:281`, order 1) + and `HullData.HullType` (`:503`). Commodity lists then gain the `None` + manufacturer level (F2). +- **Tests** (`tests/Aetheria.Shared.Tests`, new `StudioGroupingTests.cs`, xUnit): + - `AnnotatedCatalogTypesGroupAsDeclared`: + - Build `CultCacheMessagePack.CreateInspectorModel` over the Aetheria + registry, as the probe did with the `[CultDocument]` types of + `typeof(GearData).Assembly`. + - `GroupingOf` names exactly `Category`, `Category`, + `Hardpoint, Manufacturer` and `HullType` for the four types, each with no + notice. + - `GroupingOf(typeof(WeaponItemData))` equals `GearData`'s. + - *Mutation:* remove one annotation, or reorder `GearData`'s names. + - `NoGroupedMemberIsRefused`. Every registered document type's `GroupingOf` + has a null notice. This guards against a future annotation on a float or + hidden member. +- **Verification:** + - **Headless.** Run + `dotnet test tests\Aetheria.Shared.Tests -p:CultLibRoot=F:\Projects\CultLib-studio-grouping`, + with that worktree checked out clean at the release SHA. The revision check + requires a clean root at exactly that SHA, and the main CultLib checkout is + shared with live work. All pass. + - **Unity batchmode compile.** With the editor closed, run + `-batchmode -nographics -quit -projectPath F:\Projects\Aetheria -logFile ` + on Unity 6000.3.24f1. Expect 0 compile errors, and the package cache + resolving both new tags. + - **Operator click-through** in Aetheria's Studio against + `GameData/Aetheria.cc`: + - `GearData` shows hardpoint then manufacturer. It includes the + `WeaponItemData` records marked ``, and a `None` node + holds the 14 unset. + - Commodities show categories only. `HullData` shows hull types. + - Create in a gear node, then check that the record lands there and is + selected. + - Drag a faction onto a gear `Manufacturer` and see it accepted. Drag a + gear record onto it and see it rejected. + - Drag onto a `DemandProfile` dictionary key and see a duplicate refused + through the notice. + - In a read-only open, every drop is rejected. + - Close without edits and confirm that the store bytes are unchanged. + - **Negative grep.** `rg -n "HardpointType\)" Assets/Scripts/ServerShared/ItemData.cs` + shows no grouping declaration names the derived property. +- **Ledger:** 4 attribute lines (Q1-B), the pin and manifest lines, and about + +40 test lines. + +## Subtraction ledger (whole change) + +- **Added:** + - One attribute type. + - Two model types and five model methods. + - About 10 CultLib tests and 2 Aetheria tests. + - About 100 Studio lines. + - 4 annotations. +- **Removed or collapsed:** + - The candidate predicate duplicated at each future call site. It was + inline once; now it is one method, reused by drop. + - The ref label strings, duplicated between picker and grouping. + - The latent attribute-inheritance miss on overriding properties (F5). +- **Not added:** selectors, registries, `EditorPrefs` keys, sibling-runtime + ports, or new packages, targets or daemons. +- **Build footprint:** + - `GameCult.Caching` and its tests. + - The Unity package script, which rebuilds every tracked plugin including the + native bridge (Q5). + - Aetheria's headless shared build and one batchmode compile. + - The build host is the Windows workstation, which is also the target + platform for both the Unity editor plugin and the win-x64 native bridge. From 66940a318c399e13aaff2e934234eec9f3e8ce81 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 02:29:38 +0200 Subject: [PATCH 91/94] Record Q1 as ruled B and block the Aetheria cut on the lot schema Co-Authored-By: Claude Opus 5 --- docs/studio-grouping-cut.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/studio-grouping-cut.md b/docs/studio-grouping-cut.md index b9c3207c..c30c728f 100644 --- a/docs/studio-grouping-cut.md +++ b/docs/studio-grouping-cut.md @@ -199,6 +199,11 @@ No persistent state is introduced. No cell is empty. ### Q1. Where does the grouping declaration live, and how is nesting ordered? (blocks Cuts 1, 4) +**Ruled B (operator, 2026-09-17):** "I like B". The same ruling reopens the item +schema: a crafted item's manufacturer belongs to its production lot, not its +design (see Cut 4). + + - **A. Member attribute** `[CultInspectorGroup(int order = 0)]` on a field or property. - Levels are ordered by `order`, then by the member's display order @@ -589,6 +594,13 @@ hits only a KDTree file). ### Cut 4. Aetheria: re-pin CultLib and annotate grouping +**Blocked (2026-09-17).** The operator ruled that a crafted item's manufacturer and +optional branding belong to its production lot, after Njordr's lot ontology, so +`ItemData.Manufacturer` leaves the design. Grouping `GearData` by `Manufacturer` +is therefore not the target. This cut is re-mapped once that schema ruling +settles. Cuts 1-3 do not depend on it. + + - **Repo and branch:** Aetheria `codex/cultcache-cutover`, the current branch. Stage by path only: `Assets/Scripts/Editor/CultCacheDrawers.cs` carries an unrelated uncommitted edit that must stay out of the commit and untouched. From 8c0e726d84b0b12d494b3c2a06f58d20f242fa08 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 19:50:28 +0200 Subject: [PATCH 92/94] Bump Cut 3's release plan past codex/asset-guid-attribute's 1.0.60/1.4.0 codex/asset-guid-attribute released cultlib Unity 1.0.60 / Studio 1.4.0 first (asset GUID attribute, then sub-asset key support). This cut's plan now targets the next free versions, 1.0.61 / 1.5.0, and notes that Cut 3 must rebase onto and rebuild after that branch before releasing: both touch CultInspectorModel.cs, the Studio drawers, and the plugin DLLs/pdbs. Co-Authored-By: Claude Opus 5 --- docs/studio-grouping-cut.md | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/docs/studio-grouping-cut.md b/docs/studio-grouping-cut.md index c30c728f..8be80722 100644 --- a/docs/studio-grouping-cut.md +++ b/docs/studio-grouping-cut.md @@ -556,22 +556,30 @@ hits only a KDTree file). - **Ledger:** Window about +70 to 90 lines, drawers about +25 lines, README about +20 lines. Two inline decisions deleted. -### Cut 3. CultLib release: cultlib Unity 1.0.60, Studio 1.4.0 +### Cut 3. CultLib release: cultlib Unity 1.0.61, Studio 1.5.0 + +Versions bumped from the original 1.0.60/1.4.0 plan: `codex/asset-guid-attribute` +took 1.0.60/1.4.0 for its own release (replacing the asset path attribute with +`CultInspectorAssetGuid`, then adding sub-asset key support), landed and +released first. This branch must rebase onto and rebuild after +`codex/asset-guid-attribute` before its own release: same files +(`CultInspectorModel.cs`, the Studio drawers, the plugin DLLs/pdbs), so a plain +merge would silently drop one side's binary rebuild. - **Repo and branch:** CultLib `main`. Merge `claude/studio-grouping` (fast-forward or merge commit), then create the release commit in the same clean worktree. Q5-A is assumed. - **Files:** - - `unity/org.gamecult.cultlib/package.json:4`: `1.0.59` → `1.0.60`. - - `src/GameCult.Unity/Assets/Caching/package.json:4`: `1.3.1` → `1.4.0`, - because this is new user-facing capability. `:13`: `"org.gamecult.cultlib": "1.0.60"`. + - `unity/org.gamecult.cultlib/package.json:4`: `1.0.60` → `1.0.61`. + - `src/GameCult.Unity/Assets/Caching/package.json:4`: `1.4.0` → `1.5.0`, + because this is new user-facing capability. `:13`: `"org.gamecult.cultlib": "1.0.61"`. - `unity/org.gamecult.cultlib/Runtime/Plugins/*.dll|pdb` and `x86_64/*.dll`, via `powershell -File scripts\build-unity-package.ps1 -UpdateTemplate`. The script derives the assembly version from the package.json and checks it (`:150-153`). -- **Tags on the release commit:** `cultlib-unity-v1.0.60` and - `caching-unity-v1.4.0`. That is two tags in one push, under GitHub's +- **Tags on the release commit:** `cultlib-unity-v1.0.61` and + `caching-unity-v1.5.0`. That is two tags in one push, under GitHub's three-tag workflow limit (migration cut map header). No `cultmath-unity` tag, because CultMath is unchanged. - **Verification:** @@ -608,8 +616,8 @@ settles. Cuts 1-3 do not depend on it. - `Directory.Build.props:5` `CultLibRevision`: set it to the Cut 3 release commit's full SHA. Note that it lives in props, not targets; the check is in `Directory.Build.targets:2-22`. - - `Packages/manifest.json:53`: `#caching-unity-v1.3.1` → `#caching-unity-v1.4.0`. - `:54`: `#cultlib-unity-v1.0.59` → `#cultlib-unity-v1.0.60`. `:55` + - `Packages/manifest.json:53`: `#caching-unity-v1.4.0` → `#caching-unity-v1.5.0`. + `:54`: `#cultlib-unity-v1.0.60` → `#cultlib-unity-v1.0.61`. `:55` `cultmath-unity-v0.2.3` is unchanged. Unity rewrites `Packages/packages-lock.json`; commit that too. - `Assets/Scripts/ServerShared/ItemData.cs`, under Q1-B: From 56b191b406fa42e977254b56a23cb9df040acd64 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 17 Sep 2026 20:18:37 +0200 Subject: [PATCH 93/94] Fix Cut 3 note: unreleased asset-guid branch, real conflict shape, rebased line ref Soul (F9) flagged three drifted claims in Cut 3, from 8c0e726: codex/asset-guid-attribute is pushed but not merged to main, so it has not "landed and released" - it releases first, this cut after. A plain merge of two branches that each rebuilt the same tracked plugin DLLs/pdbs does not "silently drop" one side; git reports binary conflicts on them, resolved by rebuilding rather than hand-merging binary blobs. And the build script's meshPackageVersion check line reference was stale for the post-rebase state: 0c9cb57 (on codex/asset-guid-attribute, not yet on this branch) inserted two lines above it for the OpenSSL notice, moving the check from :150-153 to :152-155 once this cut rebases onto that branch. Co-Authored-By: Claude Opus 5 --- docs/studio-grouping-cut.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/studio-grouping-cut.md b/docs/studio-grouping-cut.md index 8be80722..950289c0 100644 --- a/docs/studio-grouping-cut.md +++ b/docs/studio-grouping-cut.md @@ -560,11 +560,13 @@ hits only a KDTree file). Versions bumped from the original 1.0.60/1.4.0 plan: `codex/asset-guid-attribute` took 1.0.60/1.4.0 for its own release (replacing the asset path attribute with -`CultInspectorAssetGuid`, then adding sub-asset key support), landed and -released first. This branch must rebase onto and rebuild after -`codex/asset-guid-attribute` before its own release: same files -(`CultInspectorModel.cs`, the Studio drawers, the plugin DLLs/pdbs), so a plain -merge would silently drop one side's binary rebuild. +`CultInspectorAssetGuid`, then adding sub-asset key support, then a built-in +refusal fix and a stale-value Clear button); it releases first. This branch +must rebase onto and rebuild after `codex/asset-guid-attribute` before its own +release: same files (`CultInspectorModel.cs`, the Studio drawers, the plugin +DLLs/pdbs), so a plain merge reports binary conflicts on the plugin DLLs/pdbs +rather than silently picking one side; resolve by taking either side's text +changes as needed and then rebuilding, not by hand-merging the binaries. - **Repo and branch:** CultLib `main`. Merge `claude/studio-grouping` (fast-forward or merge commit), then create the release commit in the same @@ -577,7 +579,9 @@ merge would silently drop one side's binary rebuild. `x86_64/*.dll`, via `powershell -File scripts\build-unity-package.ps1 -UpdateTemplate`. The script derives the assembly version from the package.json and checks it - (`:150-153`). + (`:152-155` after the rebase onto `codex/asset-guid-attribute`, whose + `0c9cb57` inserted two lines above this block for the OpenSSL notice; + it is `:150-153` on this branch's own unrebased copy of the script). - **Tags on the release commit:** `cultlib-unity-v1.0.61` and `caching-unity-v1.5.0`. That is two tags in one push, under GitHub's three-tag workflow limit (migration cut map header). No `cultmath-unity` tag, From f30026e0c52a9ac5a8af7a0ac5f9cc94c4dd2942 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sat, 19 Sep 2026 15:51:05 +0200 Subject: [PATCH 94/94] Studio grouping Cut 4 is unblocked, not blocked The provenance schema ruling this cut was waiting on settled two days ago: Aetheria's schema cut closed at 46efccbe and merged at 9b85211f, and branding is now derived from the lot ledger rather than stored on the design. The cut still needs re-mapping against that schema, but "blocked" was no longer true and is how work quietly stops being picked up. Co-Authored-By: Claude Opus 5 --- docs/studio-grouping-cut.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/studio-grouping-cut.md b/docs/studio-grouping-cut.md index 950289c0..a0ad1933 100644 --- a/docs/studio-grouping-cut.md +++ b/docs/studio-grouping-cut.md @@ -606,11 +606,14 @@ changes as needed and then rebuilding, not by hand-merging the binaries. ### Cut 4. Aetheria: re-pin CultLib and annotate grouping -**Blocked (2026-09-17).** The operator ruled that a crafted item's manufacturer and -optional branding belong to its production lot, after Njordr's lot ontology, so -`ItemData.Manufacturer` leaves the design. Grouping `GearData` by `Manufacturer` -is therefore not the target. This cut is re-mapped once that schema ruling -settles. Cuts 1-3 do not depend on it. +**Unblocked, needs re-mapping (2026-09-19).** The operator ruled that a crafted +item's manufacturer and optional branding belong to its production lot, after +Njordr's lot ontology, so `ItemData.Manufacturer` leaves the design. Grouping +`GearData` by `Manufacturer` is therefore not the target. That schema ruling has +now settled: Aetheria's provenance schema cut closed at `46efccbe` and merged to +master at `9b85211f`, and branding is derived from the lot's `ProvenanceLedger` +rather than stored on the design. This cut is waiting on a fresh Imagination pass +against the landed schema, not on the ruling. Cuts 1-3 do not depend on it. - **Repo and branch:** Aetheria `codex/cultcache-cutover`, the current branch.

s};^#2x0ZK^CE<>dd7JPLKu42 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 literal 525312 zcmb@v37i~7`TyVBJ=3#0yPIUPo86ow9J@3-y9wb8giCI@mGXKFT!988y*!2F6gTArpk!PG)UvO?M zeQoWevlpCl(mCg(=Px+0=PWq$oCSNo;)n%jr>CB_u(!9oMb7%reS+Yijwm=j z`0KBHYR?6mE$HspItczz3W83D-a7?i0rUa`rWqYNxfMe4+uw=!gX=E}PP{A#rrE!i zo4>js!AbCag=qM`yU8T?l(R=?(1UY)Z)b318~mc=f~M#ew3GM!+afJI|FjFw=l#~d zlSlk4uesbl81RV;YxUYG04AIA9`o`q;%SV_)_q#n|A7HoCYQ8yjemPooi!H>z|RvPIJ zZE!1zbVtD>$X^PsgfB%{>93KCb7!sUCp$v}PW1BhVCXzDIOi%o#tOsz)$X+eqSGaC zSUoi86xKbxW9Yo&6iyExPIMk_W@wq}nH~=u4$5h?$CTWcK({IScE()W(%m#R3qusNnQl2tu+?pHd0W zUyVY_NyS^*Wp6O9%vKz$oXp>}j+)}y+&x8oo=~0|M90zeJrIN1e@#uy;9$VLg z0x(wJFps@jtdPh&zG)tNw>;2K5--A_e=fL7wU2&UA zI^y&YywgYU?Ht^I=hx&pa|51Vm*=dOr>O_F^m*mcaB~d43nqP5KJeUb0SyTCNlZkLfE^3Z2{hu8VqV zRmSSU&{#CwKVr2x*W-P(FA}0&-Lv6(HK)B^Q8`smja5-lD5dl&zG(9b*SOj|)~|4l zw{6Jd?dy6_^DT{Q%;RX%*idCqU3iQdG@c3 z`_ONley|K(5q-R)r;C0y^uVf5!ex_HcN;H@Hc;#8fW<)nV1NBJ1fe&s4S@`Le8A%~ zYrBHaTo0dBI|6)G?G(qS8Gd%{K9Je9$JW8;)P};~+&Q(Kc#>{2{M_30AaiSs!V~a$ zwMrD6JFm7S&$jUO6P&b9NYPFs4MNmzQn1=nJki2Hn@0NEG%~|$WTt6kXrT6U7h%vx zsGpcC(s8h~U+Y(-t6$yCAyBUGUrcbB5%Byw^-o%5WYaD~v$Qqo1kEyty8 ze?+tm#yjOD#v^&sn=&!I16+DSNv}Lvdh5os^fnX^qiPd)jqDpnYAp3r5iTAd9X5p3PeX?EP79O_Q9sg8LMLD5G2)YaNBhfldO^BPiEQE;0kD|| zjMyz~%mzqKhyB3Xj*-5t!+@LyC=oqR#j6~TPLI>q0*zuGP6O#*8)4?TvIMukuzm(1 zGHPxiCufPQ-9rM}dOvZ>jwqz&+|$iEK+(7AGWKP0l8@^c)`5E!u)TA^z4sq^V?X zh6)?>k@VUF!(pz&`llG6hq^Q2r6}!z=}6A0Sfp;8OMDN!q6t|0`7K!@Jms@q{#`!C zx@+$xic@Q@67uO)@*z`6RVwLps;PDimgBKSxfU>KTl&GSZRuyJ^ivq@u7(5MB`U`L zxx}}V+SHD<1Im8-vkofei{`w?a^4xGy=^)Fbu*(m<5OaJ=y^zPS+DSq$Qg!uAJbA0s zFTztiFUFm~Q(}l`0}s!0h3Iv7(vFO0Avh79yisI{;t1kwX1SQXXm0{Imt_j^5lNuLsSqtVbE69?a$DC2IQ;@ycku-iMJi%pSh68UT|^1zFWeBnk!zF2<6$+L5jvP0{BDcMPz z*=f)EswO%TMukDm2K{)Xc@kwbS^p6ZWSA=j9ITl_ag-XUo;ZCEeR4RE>sLYy4Q6k}$uz3Cv1LI>KbBqvsD4p+ zgpZ0|6Q?*`rQlQ_*j)|Dc(A{?z70A-&T2-zD8#@o7kmwHdMytj2MD3`%IQ0E7g4NJChG6?ArJcsj*c`svdMi zTDv(G`FX9>o`>~ko#Umtpk*e$Oioy2q>mnU0 z>gL0f#`PAKB}Tu0Su9ncS{5Mri2Se2OZkr!MU>tI zRJdv<(n)THOm9&T@>&eOOMgKvs}#~(!5Dp&v!SuR;V|lVW=vnva$70J=>wQG-KDgK zHfvKmnMWiaCDQ1HrQ{)e`lx_rRL#Sy60c(`0Nh64KKevDmO`a8z0-|~vnrjVGb){f z`BGmcUY*`fz~SoLoZSiQvQwpfb^(HylFyNDPj1s~lZU^H@TK&8gsgvzkp0uUTn(;t zC3o=NGGD3-@)%DMqtnD&$Fy@`Z|8C%hJEEqd2CAO@;gO$SGvbGukI99%8eED=QtYO z@}X@JgGV--Tvl0W>@|f_hk7dAjf_AxXgM39YkI*cVP>T;+Rrjhu7pmngE_f`e@DWu zHsPd#H4FO4x@mk)7aH$Lku1;Nx$+OF&o8rjrdkyQpF(B&zW{m{>Vn2cdeMMxq>?i_ z0!FU7MCo1dxa#2vb%t@kdhEPzPy=f0YydYep;k{~2r&09 zq)1d9`A06(rIX22Xnb7aJtFZw0cBO%4NPJ3GIbW4g@uG^5WU8n+(tsqithtA)alQ3 z-Ja`m-Slk0#@97llyiB$ggo&&x^`)z@ecG81jE6MrNI``F_SVHaAD+6ZekQ!FFrc0 z_Dh)5s$~p$dVS_LQKn#FayM^LdJoU!2!zk*2nr($Yx^nWp~?*m4I>rxRVrSr%}Vkq zqA>8K_u_W1!G4cp8^NC`nM@%oX60#``l+vuR5b$HVWs|l%Ej#80?DWM5qq>R#O(b5 zc>R9Kf!eCJ@bBYMvn%xv=J6Wq#QV_X@v5YU2~i27yweB=nE@R`j?`(<&3Q5^$1a4% z*(g{=Jn~qnf7sFsvlXNlH}s6s2NBN&9!os-=@!=SvClNIQId_)&+?u=#DjdUo*=LM zU94Q7(y(XJVl3TBwj*(=!IiLf3B@xz{Tv+2@xbElc;+#o*_GRb{Uaf7>F4npzX+k# zwX&Y{1>Wml7 zJr?y>w=0Z~TRPbCe32-ujTz`&Niv5}S`>RV`6`Jd6l7I%@2c71sJWUg6r*CcNY#$2 zCcbh7%Qaki-_wcaR?K2wsEfnoRTODKtJ3l4=3#O?Zt^H;jrC8BlCMEHYj9N1)AD~kowo&y#OC}!KpnNrBMHMb~bZa<|szS3*+ z64U0bEp5tY~?s`PiTmrnPxqrG&wmnHU6&KRgo+mcjTmw<95p+^DhJ>tu-XZ zi&KdeSwV-%Y0$2iXG{(AVix9#*;XJ7}ooA2L{wVJ_X^g6md*}HI ztqp|ZZHn%f7#N4jz z6}U=4T;z(4T=9`BK61rJuK36mAGzWq*Z3UANd6r}MlXkgBhF#Dw_X*@-pNNC?1+6c z-|DA&xcZYkvSSpx*R8rM%9carDV?svwofC zT9uht&5o8&@_9VMhD2sIcONhHXGkD@mWOmH54n<1uGq;{WHYsRS>UcgcoP7ND!qe3x#Uje-^5EQkRpmmooN_utV zYcGYXK2Z)V!}22MvDr3vAQ2g09Fa~psD?v1hH{Wo;F zmPc>(lCJbW5c<;Z=F-JHjQW*IF%3HKjKfNyQcUhgH+`k)B^!*L;kZY{9Q;8AEv0AS zJ-R3!Emz_=VK|6KH!F=!_2JVFIE_y03@fEdL4w68`%%hW>1<-}e8GSI^Pe^4uF<&5 zO)%?J;Rw8>U3`O}0}1hV>y~_7UXGnNtDJZdSlJO8X+plT~@SSC8@; zMntuvKVwf?0sk5D-`TlWk1lq^_|sSSs@-PQWE&pc^-Yk0I=~nC*ws$N)Jt``)gHEHwN;)u z3S3I(;f(C&GEKLXd>!^9C+F`rZbd2OR!y*rt0M=rduT&ib>xtCDAI1U>d4^}u!8oY zxqdSauBH5_bCvoGvY@eG0GF{~5XZ%e8=}#{Oq}{GN6!{LheznVlO?bmp9^5>od>Zt z-b8`s3tK54Z8fWoZ>o27M=lI&`Q`fN7DhhWhE}b!r$QZ(Y&O+<(nmh}^^TK-;#{<{Cjhw?04qQ$bMt) z3g@k@ZPK&e+WPy6Hd5F)p28pB7xAn;?gzp5DW3J03tK6lWDhuvAE0-&Sr_I&g*nK= z$R}YOsA{oZR*vJ^vQ6m@EA@j3rN(dwZkX&za4H!k;(7<`7hJuH)P|frYkgh2C0onr z|J~qj%iC7m*6;YZFDEWNZ>4^yr59$0;gam(avFNN$#uT8v`XX2CmHS8b&<=&=B!C% zIvc+9xt02nc&lw6C5BOUw46frN;wU^OkjU~lYQJ!kO`hQHa(kZA43@HEuB6d4;v>? zKJFu!C|9W_OlOWIic@%c9Hi4j(Y~=UJm}j|ILun(SO?#|ZX=_74Lw{9Uba-pOsSs2 zSdZ8nU?UcQiD810Hiqrqxn zpxQC>svbhKFRtqFHc9K}WkfZ<5kER-_6&-9 z@w&6iVIj3{gjQy)HuCDCFYXGc9RWi+>&|9xCZB_8**^MdhjHy&(j6NP%iYdDN>A3P zQ7TL+6sHuY#P!Q~#T3`{V|3~i_DXaQhnpSTS+%3&C5S!ectqb#K13Ys z4&q1!v=(RfrLR?PswqR<8BjDHd6!Jb%(5c)vA4_3vffTtYh9$9W!?#$soYwU{<#e7A~LbZ=s2}`j~$#8H!VlvVBw#)z7{n zo8yRqm5-?XVtt^tTcD;_2*2mQ9ezCTQ#R z;?%5xvq1C7XUPWf-Y#`T>Kse1rR8nO$>I_!q`Q+`-l3KHyR6+5619!6Gd&xYGfS?w zi~75g$AGDn+B1OV8DRM^Te%W&=0e)xDu|umf==rD!IMdX+CaLSqrutSFS>RnIZF2w zS-+j^4B5m1!?$hXuv&POVh_gYM;v_>GzUa%UYy?SFg3dLR!6@X+Ra3714#FU|H#G# zaiWiwY8N3;wOD&gORjsxa}v4k5{?=rjLWc_Wq-oSVDjAU=$1U60!a6kJm^Ma0X>Rr z&B}(vb6qYID=Do?->Ncl%Jb?Tm?(UY2~Qqcx-F!85o`3Uy5+^arFSBV<4%Vze?#)Q z+r%QUtmc6}t{l8*9_d&un?tTWjApKQ-CO$M_N3Kb44E`(EB!p0Rc)&RIiMEs;^i+{ ztO}^E-h?eS}9&}}{31M1;YJcd@vN85&~Ww&P2{luYalJsrO z;W{@Nngg}74$KbdiT#*PAUCETK|7qCTNhTddZ$ON8jp3+iD7{Spuzrp5)M;o-PR!w zMtCM;u>$L5AsZQV;>Xa(>tta6>n zefi?NE*69L!y6-^QvWe|mmT;R8OIL%x*R@a;53&=Uyyo!Pjp)%l@%8^EL=muY+65W z)$OQ>?es5@o*nEul6;f1+FuQr}ap~PF^`GRjKJH}wrjzxFc3FQqiL4f`p_b|cbH zb={TeoyM;`u8@ zO6ypRbpf@gQvaFhD$2g)l=N*=60@cP)0Lk~NmJ0ZHc#*|xtBSeyav+cfL8a!2hU3V z7dfBrI6hCd^ZDhA@hMsxgjK+5w?@6uJs~cD2yI|oxNTUw1%-uXh&ar~z&w;24?jU2 zX&Vni`v9P7IKRtRyS^!|+8G~JyUh)l6{aWAm#W(BY5)d1mCaSbdHJW$)kB-KSHJ5B z=&GM=FvdEq+wgrM*8}_83)Fu(h2#mC7f0t7)7L9+{Y7;9Yw6@dUK66R_%_&G;!~>G z*s?eGhgU&gitZy*qrFjjDlF_}jI9i|cw5%7x+=R$_Pul&&Bd3C?*l0oG>H4A5=NFzmA=W4kvZ z@*=-=@-lt}G4p*E-zLlTal#C(6q=A^b^KcMZ?5`3C=Ih-P8j*vw_z0jTMxSpFvzR+ zKsWSX?fH01OO`K?M84-k=wy37B3pALiJ(4(p>4?3AxK;~^rmOY0k3TWT@E;-33NN)Ohxa79=SYhyoNSC%9gg~${6cS zcc^;XSin-Mo0fOij-CqmI`Vt5>Vovf+KK(;-(fGINU~+H^WU58i|Pf6Mv8n*WG33WW-Y5i>81f?_mkL2K zhCC81xzyF8#|(*xT8rJ5ep1}M>#F}WE< zY3d+h6Ht=cEZqc@qE41p^+8t3(4<#xl-_|@t+zY%rg4G>6(Cln&e?n0=T&8n&KYo? z6F(amlzxsHWrp3(f2Oz`@ANvD(I7bG-qy=^m&O*<)J-~O7PIy)imKf@a7@1dQx^1H zhkaZg-h=AAORn?Yy;OS|25!#hFzc``z%OY%7%;m4ezsA?OK%fZ9>1vyaxwWz@<=&vnX0P`WuS(8`6a zgL_QlbCG@UaSL>oYhOsy)-9yn>$|8WbG%=CHWi=WAV#{V4Hfrvv4FvJM>(~tNF&_| zlHG6?aR}PZWZS6w+I7*kQatd#O3)Q^x@~*nnyR|QT@mDonUvU>aZe6xNuD{Cn-YgTcGp*nbFTNs=F^0v-cr(LQ$TPH?yYdn%U(-{SXa&ZVzsHAasg3TwN37-v-<|AvWUFU^aFq`<&gk zGWy!)y3NaI4fk6I|FkkO+T=#BK2 zKGojAH4zHPd4C7*Y>~n@^mM()rg1|ooC0fKSH*AY&uPyENE=u`dBk6%`fgXO+JG`$ zJtEuH?#Bd_OzDGd!1n}vrVaSMfQNXrDoJ%T z7y5~|aK_0t6(m?CRohe0R;A45pnnY*ELmIng&5Kf%44jC=%vcC%g=DJX${`g<*(rK zohZvJk6ultykXn??iAVgJ(^&p-k+DzVrjXMZ6hbjwv|)Nw!_JX5GEWNKxar>Z-ZxY z0wTLLtgH9$ys)5cve{|XB50*aq3O-C<9!BG0msSC_ z{M}b9cCtZ)-6p>P*7oJNcHE@W42_kB2W=vHQx9fEUmVv?oit!yslp;4r$ff}ssCNY zZA%>M>?Qe~JPPR_n}Tx{L1zFp&eea zj(@0r1m(@Vk+lSFo^kZsp|#tWD# z-v&mD?%NQ`{TCQ_>)*GrZamT|pTD7aOdKUR*94g~%gJ%5BaZze$=5YmK@Qa?Y>)s0 zQ04MIsptJXRMsCbH_AR}ZXx@Sxy9_m=FZ3%&j`1|1=rZB^3hxJ5gs~=6$kHT?t}GL zsgGEH5oWKU{NgFa>_ptKaRK6S@x!gs>FdY}8{(w5^dZD!ZuA@B)Xwt7&0V9XPG?5+ z0UmD4LTpuk!WOdZ1X$1Cqka=YV9TgV#0_E5l&(^pJK^{ifY;cZ+Gk+nyw+Xo4jZaD zL`ZKTXuRSiqOYBSvOD4xl03N;cy#aBy)oWb)jiNXm6MP1$P~Vm-ln)~<5BtDF29fQ zSP%rAL2?IFdMA%zX5Pwj{RK5hCr$dK=qUZJ9Dma1I9S@4bF5^EhsD%&Q}UVYltcOh z#kW1E+ZD%OH8K8{t@!epH2%|yKc$d9V{V+TF}LJS%aq2CpU5$3ag@)b9G^1|osL82 z_^T&!*s8@rK90j(Qrv7Rms{%kF&uP@Np;PxtUOyOaj^2^(qwyCPmj`1fQ=4xrJKXG zHqe*Xr1X;tx^}iJoe_U#at`Af`@w=Esjs`z9{O!AQ4CImW~M@0wW``NvZ0FTWeL12 zR;a&Heyxh~9kTW5CjGhaDE*}}!;GwI^Fey3fN4)FEe@C~RhO^yZUj&7;Zd&6iPKN% z&9c^PJT7bbMD5v$6E(Gh^j_jPIn(=$w6->j_LYBA-!#~A|JJ(gmdL|ot5P3BgZj>M zGKGTCdkT(@4KB3ef>H7>Iyv?6k@n{5Om(HcD35chi*s5YXY2LixIJ{tkeYL=GYG5x zXPLQCcBZ*Ave%ls!g(jmTh-s_EqP8^u>IQD*8!7+N`0}VA7!WGA2!tacMtS%!aaFF zIS(5e1IWWRlIKC?!CK@p)w9p=YGcHjawk)Qg#LucvsBM$_N_iO2hnrMIdAVa^! z&aSqRmD3vwD3dTsngUg}@sk^Zr%V~rooDyS!4 z#-nZgIK+(~LK#2kPuCwm){ST5$4iKJqNVqhiRm#IbueBDCB3sIOK;tHmfl9I>bT1a~)+VU{6t>+zS zOb#}}8=gyHrexZgO;UCKMAgaRhALV5SF1~|K6eFkwrHjKYtqC}VUF6#5FA?Yd}B&~ zq&-An(pi2Km;NyA0<@`F9_|oVZtcyjAt6VL&th$I!JV|Qb_Tub98PFEU9{R+*idz{ z+YQo3p-7;I1ePoKO?s4LcO_^Ct9Gg%>!%a0sfO`HUAOaB^DzE#`ZXnB->*Wxe2%0} z4`Faeu-P{q{Yl@Nvp1+GE@W?%Q_L=v!y&mhnOn>*!_`8)LdjJyxe6y&;pAF4w4lE7 zFSz;(lfBdnJ%%vZ)r8C6G11D|+gk76&^sFR1}$d%20y7>E_gA>$Cb(zInpoWn?l|qq+x6u^3{$#j9drEQ6|OH6O5egjwSHf=Zamsb`TUKCK6Ll4|sa^R7^Z54vAk~ZT7d7V7%;8*|CV6U}Tq1v)U8%x}-ZnmopL@ym7aJtI};(x)LOX0e&aPky?U zN9uWiK~t$8o{zt8vhi0Lp3qQDw(r9;Zg61>HFf5&md%b(L-+yk5Lc1Ng9WD=c}+0% zs=WhTsX5S9DcqowPjN24zYw*HLU>`qi0#MgQ!euIl>%la!I{VxwJoW#PN?-&trKdg zF<&PfoxA?hDP}~zjvY4CitMZ#pW6%R50ROB_gayjW=wJGt?iN4(L*7wbN6)I8+Hx4 z!l>`eD>bblos-k_8Th)w=!(*3?M15V3fVu~l?+mT=^D@|wT0Lf+6y`hP@9U=UE!7f z2;aWAy7}}tc}^sYcdJG<3My9L;n9i%oC z1i$D1*8Hcox(%Pu`g?%?w9McN@E+WL%n^kj=l=j0YbUPYdDk}v=ApqdEBhB+BVL%7 z4D&}78T~*fx73>HSjy$KV{x6%3UTtf`nG-0*R-K&|Hz;}*T31YLph?f<`T7Dv|(>g z^x>Wy9tLaP(=a}64TJ@%3}S735CQXBPQ%Y~5^pl?{27Avn*6c?)Fg$U70k)dYTu#C<1L2$HM%fi| zirHJ_6tXLE!iI*-^b?p%bWTS}g&fzfdys9N)+) z4}NOO$tGxO3ByK^1GWpFX<1BvsSM6)=Qq96GU$>f zmUUKNptCBqcUF!|`YWPOOlUKo5Lbpc!_S@B8;=k_l zSq%T!#uRTK?S3`|AJ>GaweNZBea#E)YhF3d57xx)BVIMOuXH2%7cA8u^-XJV^~YU82phGDywg_V(`yaW(*+&nKBIT?mi!S7M=dgWJss2N z(lC9OMbI;kuw|IC%nM^ZbF42+Z!kn*J~E>0fyCR_9_p{1r;4I@&tOg4JvM{)XS!59xKHwFBR8 z+Fhkoy^c=%yv-60Q-+)JXjj-74Os6})D;fSubBP=zhUc-rl}9wIoRqHe?Er0Qpf{_ zbftbY95wd6)s1pj$zcdwrO}R^n0nV%)K?O${!ch2o6)b2+^nl1#@~o%n;CJa4>Pn< zJ}xBbsC_dE2H5N`y|8 zf2qvD+FHS6AHRzm|M(3f)z^`*)Rhb=UFQ9ku4WJFOD0J>ujl`r0G*S4Hzy7IV192j z78bC1ngd*9eWL9iaOVt*313I-0yrHTv_5Z7T>V9(aYPAkt-Zj-R>A5UZ(($^DCerN z(zYzP!xgq~Avp>#?^ibVz5ddP756Yz+!XZ>t&~r)58cTBt1}x-4g6of*LMYc?65yg z<}fX)_Ta0%4k;$GgY)rcZy(P8R1lVhmZ+|iQ_S8aho;SlfLqMoZEl>s$J|nOgSnmA zdvUcirPy*6U9RHGReZUMFIVy9D!yDF|9yJbJz7TK@qP~&0q_A27y4;TUPArBbg ze?jNk<|5pO@h69?F8hD_7ofFku>T%pUO^AZRI_Y9mH{1#hIP5V)D@4VwUV@! zE3H@MeeT<-Y@~IK9K^m>ZbP8kox_LF->NHQeS#03O<`ORtMBahQt;MCgqAqRt4<&9 zM0>U9mN;7XIvH7*S#ZY*t5D^7guvO&s3)u!MBXB@`Q0MdLdL+yRaYG&g|tYZa&>B) z#t_|MN#_aU;rvt6FWWygQ8(Q@c$Z+#E8X<_hOnWeBHO+Zr6pK|4W$_AJ_YQCP9biN z){mSR8d#wgg|W5^PwV5c8zar}bAMxif4S-ZGk16_s+DH2o_{Q?Q+F(^Hm3>Lv9Mxo ztO?w#&QodmJ&dHSj9VQjhpkGG>;uQ4v8lt(pWE`1i&Rb6PIC-CJ?_+8d+K%` zuKod1;6@X5f9ab=$Eodgd5fbzLwTfcb#ym*Nmq$x7Y^Ho%j{itrx)KQurs|zPVHq# zpT0w6NjFo(MZ4W1?N#jS1W&P##w8@%MyXyu5!+7KdnRH#2z&2DY>BYBNW zls5I+M8(qL9>_T;!%bKGwMT|%(&F|4(BuL%#&^Cj3zM;Y7Mh{ZBNRz2Cyc4e_;d$v$X^U9^;a06K0c%;-VRO{bu>?&@ZY%Tu9xqE2@r zeQ!DhPQ#YNu1@wv9EU0hF^v#oPdz)0jBxkJz;jJYEo$A})K^&YT`DOfdkfMj&_IFY>1XD@AvtPt&fQt`skKZ9(l=mHSBu=7v-zWch}{Xt;vGfhizv>rO