Changelog
0.2.0 — cloud, Editor tooling and verification#
Added#
- Cloud without lock-in.
ICloudTransportis an opaque put/get/list/delete seam, so the package ships no vendor SDK, no account and no credential.TransportCloudSaveProvideradds keys, metadata, size ceilings and precondition discipline;CloudSaveSyncServiceadds synchronisation, conflict policies, conflict-copy preservation and an offline queue;FakeCloudTransportmakes all of it testable with no network. - Conflict resolution by generation, never by clock. Two devices whose clocks disagree still agree about which save is newer. The losing copy is written through the same verified transfer path into a
*_conflict_<rev>slot before anything is replaced, which makes every automatic decision reversible. - Editor tooling that configures and checks. A guided Setup page with three presets, eleven sections that explain the consequence of each choice, a Validation page with two depths (package, dependencies, platform, identity scan and a real write/read/delete), a Platform page that renders the support matrix with evidence, and Samples & code, which generates a snippet from your configuration.
- Verification, including a defect it found. Fuzz and deterministic corruption tests, culture-independence tests that impose hostile cultures and inspect the bytes written, measured performance, and a probe that runs the whole pipeline inside a built IL2CPP player.
- Documentation, samples and packaging. Twenty-one documents, four importable samples with their own READMEs, third-party notices and a package that passes its own export checks.
Fixed#
- Timestamps were written using the current culture. Found by running the pipeline in a built player: a save written on a device using
dd-MM-yyyycould be silently reinterpreted elsewhere, or fail to load. Now written in round-trip, culture-independent form and covered by tests that fail without the fix.
Compatibility#
- No save-format change: every file written by 0.1.0 remains readable.
- Configuration is additive; no setting was renamed or removed.
- The settings asset is upgrade-safe in both directions.
0.1.0 — the framework#
Added#
- Options, diagnostics and the result model — failures as values with stable codes.
- The document model and the serializer abstraction.
- Local storage with atomic writes, backup, quarantine and recovery.
- The save container, slots and metadata.
- Versioning and migration, registered as code.
- The operation coordinator: one write at a time, cancellation, supersession.
- Persistent object identity, with project-wide validation.
- Autosave and checkpoints.
- Security: integrity (CRC32/SHA-256/HMAC-SHA256), authenticated encryption and bounded compression.
- Editor tooling: configuration report, smoke test, identity inspector and validation.
How the framework was built#
| Phase | Scope | State |
|---|---|---|
| 0 | Project inspection and architecture proposal | Done |
| 1 | Package foundation: options, diagnostics, results, versioning, identifiers, Unity adapters, composition root | Done |
| 2 | Data document model, serializer abstraction | Done |
| 3 | Local storage, atomic writes, backup and recovery | Done |
| 4 | Save envelope, slots and metadata | Done |
| 5 | Versioning and migration | Done |
| 6 | Operation coordinator, cancellation, concurrency | Done |
| 7 | Persistent object identity | Done |
| 8 | Autosave and checkpoints | Done |
| 9 | Security, integrity, encryption, compression | Done |
| 10 | Cloud abstraction, sync state, conflict resolution | Done |
| 11 | Editor tooling: configuration report, smoke test, identity inspector, validation | Done |
| 12 | Fuzz, failure injection, performance measurement, IL2CPP verification | Done |
| 13 | Documentation, samples, packaging, third-party notices | Done |
Compatibility promises#
| Surface | Promise |
|---|---|
| Save file format | An older file is always readable: the container records its format version and the reader accepts every version it has ever written. |
| Configuration | Removing or renaming a setting is a breaking change and is called out here. New settings arrive with defaults that match the previous behaviour. |
| Public API | Additive by default. A breaking change is a major version bump naming the affected types. |
| Settings asset | A newer package opens an older asset; an older package leaves a newer asset alone rather than guessing at a layout it does not understand. |
| Schema versions | Yours, not ours. The framework version recorded in a save never forces a migration. |
Next#
- What's new — the same history, in prose.
- Migration — migrating your own save format.
- Roadmap — what is planned, and what is deliberately not.