Problem
CliContentService.LoadContentObject re-saves any content whose JSON does not match its C# class (SchemaDifference.MissingFieldsInJson / UnknownFieldsInJson) when ContentConfiguration.validateSchemaDifference is true, which is the default. LoadContentObject runs for every entry on every Reload(), and Reload() runs after every sync. So Revert All downloads the server copy, the reload rewrites it in the class shape, the checksum changes, and the item is "modified" again with no user action.
Status itself is correct: ContentFile.GetStatus() in cli/cli/Services/Content/ContentService.cs is checksum-only (manifest checksum vs SHA1 of the sorted local properties, plus tag diff). referenceManifestId is not an input. The file really is different after the reload.
Second writer with the same effect: ContentObject.OnValidate -> DelayedValidate -> OnEditorChanged -> SaveContent fires on inspect, not only on edit.
Relevant code:
client/Packages/com.beamable/Editor/ContentService/CliContentService.cs LoadContentObject (the validateSchemaDifference && schemaDifference != SchemaDifference.None branch)
client/Packages/com.beamable/Common/Runtime/Content/ContentObject.cs OnValidate / DelayedValidate
client/Packages/com.beamable/Runtime/Modules/Content/ContentConfiguration.cs validateSchemaDifference (single reader is the branch above; no runtime reader)
Identical in unity-sdk-5.0.1, 5.1.2, 6.0.1, 6.1.0.
Impact
Koin (Marco Williams) escalation 2026-09-04: 91/330 items permanently "modified" after Revert All, whole team affected, only Publish clears it. Customer no longer trusts what Publish will send. Same symptom described in #3573 (2024). Mechanism is confirmed in source; whether it accounts for Koin's specific 91 is pending their console check (Schema for content with id= warning count).
Repro
- Publish a content type.
- Add a non-Optional field to its C# class (or remove one). Do not edit any content.
- Open Content Manager. Items of that type show modified and the console logs
Schema for content with id=[...] is different from content JSON.
- Revert All. Items return to modified within one reload.
Proposed fix
- Stop auto-saving on schema difference. Deserialize with defaults as today, log once at window level with a count, and expose an explicit "Migrate schema and save" action per item / per type. Remove or repurpose
validateSchemaDifference; today it only gates the auto-save.
- In
SaveContent, compute the CLI checksum of the re-serialized properties and skip the write when it equals the checksum of the file on disk. This also removes the OnValidate re-save noise.
- Optional UX: distinguish "schema drift" from "edited" in the items panel so users can see which modified items are theirs.
Acceptance
- Revert All on a project with drifted classes ends with 0 modified and stays there across reloads and inspection.
- Editing a value still marks the item modified and saves.
- A migrate action produces the class-shape file and marks it modified, on demand only.
- No new writes to
.beamable/local/content when opening the window or selecting items.
Workaround
Set Validate Schema Difference off in Content Configuration, restart Unity, Revert All.
Problem
CliContentService.LoadContentObjectre-saves any content whose JSON does not match its C# class (SchemaDifference.MissingFieldsInJson/UnknownFieldsInJson) whenContentConfiguration.validateSchemaDifferenceis true, which is the default.LoadContentObjectruns for every entry on everyReload(), andReload()runs after every sync. So Revert All downloads the server copy, the reload rewrites it in the class shape, the checksum changes, and the item is "modified" again with no user action.Status itself is correct:
ContentFile.GetStatus()incli/cli/Services/Content/ContentService.csis checksum-only (manifest checksum vs SHA1 of the sorted local properties, plus tag diff).referenceManifestIdis not an input. The file really is different after the reload.Second writer with the same effect:
ContentObject.OnValidate->DelayedValidate->OnEditorChanged->SaveContentfires on inspect, not only on edit.Relevant code:
client/Packages/com.beamable/Editor/ContentService/CliContentService.csLoadContentObject(thevalidateSchemaDifference && schemaDifference != SchemaDifference.Nonebranch)client/Packages/com.beamable/Common/Runtime/Content/ContentObject.csOnValidate/DelayedValidateclient/Packages/com.beamable/Runtime/Modules/Content/ContentConfiguration.csvalidateSchemaDifference(single reader is the branch above; no runtime reader)Identical in
unity-sdk-5.0.1,5.1.2,6.0.1,6.1.0.Impact
Koin (Marco Williams) escalation 2026-09-04: 91/330 items permanently "modified" after Revert All, whole team affected, only Publish clears it. Customer no longer trusts what Publish will send. Same symptom described in #3573 (2024). Mechanism is confirmed in source; whether it accounts for Koin's specific 91 is pending their console check (
Schema for content with id=warning count).Repro
Schema for content with id=[...] is different from content JSON.Proposed fix
validateSchemaDifference; today it only gates the auto-save.SaveContent, compute the CLI checksum of the re-serialized properties and skip the write when it equals the checksum of the file on disk. This also removes the OnValidate re-save noise.Acceptance
.beamable/local/contentwhen opening the window or selecting items.Workaround
Set
Validate Schema Differenceoff in Content Configuration, restart Unity, Revert All.