v0.24.2
Version-fallback for MinCompatibleVersion — server-side only, no wire change.
- A client whose method
Versionisn't declared on the server now falls back to the highest arg-compatible(Service, Alias)body: at/aboveMinCompatibleVersion→ forceServerPatch, below → reject. Exact-version matches still run locally (floor no longer gates them). Lets a single server declaration force old clients to patch and auto-stop once they update — no per-method override list. MinCompatibleVersionsemantics redefined accordingly (was: force-patch on exact match below floor).MetaClient.ClearConfigCaches()debug command — wipes registered config providers' caches (e.g. on-diskFileConfigCache) so the next subscribe re-downloads. Handy after re-publishing a config under the same version in dev. New opt-in markersIClearableConfigProvider/IClearableConfigCache.- Fix (regression since 0.24.0):
[MetaMethod(Version = N)]withN != 0broke the server build — generatedServerMetaConfiguration.g.csreferenced a non-existentGameMethodIds.I..._v0constant (CS0117).ServerMetaConfigurationGeneratornow readsVersionfor the dispatch/signal/migration switches, matching the emittedGameMethodIds. - Patch-tracking copy auto-generation decoupled from
DeepDesync. The{Impl}_PatchTrackedcopy (whereStatewrites route through the patch wrapper) is now emitted for any force-patch-able service — a client-callableOptimistic/Server/CrossOptimisticmethod withVersion > MinCompatibleVersionor a[MetaConfigStructureBoundary]config, or anyServerPatchmethod. (All three of those modes run the body on the client —Serverreplays it from the recorded buffer — so all diverge from a changed server body.) Previously onlyDeepDesyncservices got the copy, so force-patched clients silently received empty patches. Service bodies must be copy-compatible (wrapper-typed helpers, nowrapper → rawcollection leaks — seePartyService); incompatible bodies opt out via[MetaService(PatchTracking = false)]. Opt-out rejects force-patch clients instead of mis-serving them, at both force-patch entry points: method-level version-fallback (negotiation →Rejected) and service-level[MetaConfigStructureBoundary](subscribe rejected with aFeatureRequirementbefore any state mutation). Copy generation is per-state: every service on a force-patch-able state gets the copy (andResolveSiblingByTypehands out the copy under patch tracking), so a force-patched call that fans out to a sibling service on the same state (e.g.BuyEnergy→EnergyService) tracks the sibling's mutations too instead of writing the raw state and dropping them from the diff.