Absent fields are kept. Send version for optimistic concurrency (409 version_conflict on a stale one). items, when sent, is the full list: an increase is credited and its stock moved in the same transaction; a lowered or missing line is 409 shipped_quantity_reduced (cancel the shipment and record the right one). Nothing changed: outcome unchanged, nothing written. A canceled shipment is 409.
Scope: shipments:write, channel:write or admin.
Idempotency: send Idempotency-Key; a retry with the same key replays the first answer.
Rate limit: write class, 1,200 requests per minute per tenant by default (read class 6,000). Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; a refusal is 429 rate_limited with Retry-After.
