- Add migration v2: source column on change_log to distinguish local
vs sync-originated entries, preventing the echo loop where synced
tasks get re-pushed as local changes
- PushChanges handler now skips save when server version is newer
- Client PushChanges/pushQueuedChanges collect and report marshal errors
instead of silently dropping them
- De-duplicate getLocalChanges/getLastSyncTime into exported sync
package functions
- Fix logConflict winner detection via pointer identity instead of
fragile UUID+timestamp comparison
- Fix sync down to actually parse, save, and tag-sync pulled changes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>