Whistlegraph turns, slice 4: the return path master
A worker that commits tells lith (POST /api/whistlegraph-turn-done under the worker secret). Lith broadcasts 'updated' with the thread into the thread's socket room through an in-process bus (system/backend/whistlegraph-live.mjs) and pushes the owner through the device registry ('Your piece is ready', url /<code>). The phone's thread client follows the server forward when it has nothing unsynced — its local ledger is the last cloud ledger it saw — both on connect and on a live 'updated'; with local work the server has not seen it still reports a conflict rather than replacing anything. The engine adopts the ledger (or waits for a running turn to end), reopens the head, clears the stale journal and draft, and says 'Made while you were away'. Tested: adopt on connect, adopt live, refuse over local work.