Every actively-written delta-time value now stores an absolute anchored
timestamp, shifted by downtime at load: remaining time is preserved across
restarts and idle saves become byte-stable.
- Item v11: LastMoved (was whole-minute delta, rewritten every save) and
DecayResetTime; Mobile v38: the three stat-gain stamps; BaseCreature v21:
SummonEnd; plus VendorInventory, StealableArtifacts, and ML quest objective
timers in their own version gates.
- 17 code-generated classes swap [DeltaDateTime] for [AnchoredDateTime] with a
version bump and MigrateFrom each (generated from their current migration
schemas, so old saves replay the delta reads).
- GenericPersistence payloads carry no anchor of their own, so they inherit
the save-wide shift: entity indexes always load first, and every file in a
save shares one SaveStartTime - World.LoadTimeShift is stamped from the idx
v5 header and applied to generic persistence readers. This is what makes
VirtueContext and StealableArtifacts convertible at all.
- Legacy read sites (old-version fallbacks and migration replays) keep
ReadDeltaTime: they decode old bytes and must never change.
Acceptance tests: item serialization is byte-identical across saves hours
apart, and LastMoved/DecayResetTime round-trip exactly at sub-minute
precision (impossible under the old minutes encoding).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>