docker save the image, then deliver its bytes to each serving device.
Idempotent by digest: if the platform already holds an ArtifactRecord for
the computed digest, upload + register are skipped and every device is
reported as an un-delivered (already-present) entry.
Deliver a PRE-MADE, content-addressed archive tar at an EXPLICIT path to the
serving devices as a kind:'archive' artifact. The generalized core of
shipArchiveFile; catalog compose-bundle delivery (a registry download
in a temp dir, not a build context) enters here. The caller owns verifying
that the file's bytes hash to digest before delivery — the agent re-checks
on receipt regardless.
Phase 5 (remote build): deliver a PRE-MADE archive tar (a compose build
context the producer already packed + content-addressed) to the serving
devices as a kind:'archive' artifact — NO docker save. The tar lives at
the deterministic buildContextTarPath for its digest. Same delivery
mechanics as ship (idempotent by digest, per-device upload via the
resumable ingest path, register once on-device), so the agent extracts it
before docker compose build.
ArtifactShipper over the platform's ingest flow:
docker save→ digest → (idempotency probe) → per serving device: mint session, wait forawaiting-upload, stream the bundle to the ingest URL, poll untilcompleted→ register by digest. Requiresdockeron PATH.