Host-driven upload lifecycle on the unified composer rail: the host walks `local` → `uploading` → `ready`/`error` and pushes every transition through `updateData`. Retry re-attaches; the composer never uploads.
