e59996a385
- After each mutation, the affected tab + activity_log are pushed to Sheets by a single serialized background worker (Postgres stays source of truth; a mirror failure never fails the DB write). Concurrency race fixed by serializing through one worker; PYTHONUNBUFFERED for visible logs. - _cell() formats dates/timestamps/numbers/bools and neutralises formula injection. POST /api/sync does a full DB->Sheets resync of every tab. Verified: add/edit/delete propagate to the Sheet; full resync aligns all tabs; DB and Sheet consistent after cleanup. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>