All posts
EngineeringSeptember 19, 2026 · The Ubriot team · 4 min read

Separate upload, acceptance, and availability

Mobile releases stay legible when the timeline distinguishes a package leaving the pipeline, a store accepting it, and users actually being able to receive it.

A mobile pipeline uploads an artifact and receives a successful response. The release timeline turns green. Someone tells the team the build is live.

The package may still be processing. It may be accepted but waiting for review, held for manual release, limited to an internal track, or available only to part of a staged audience. The upload succeeded, but live describes a different fact.

At Ubriot, we separate upload, acceptance, and availability. Each boundary has its own evidence, and none should borrow the certainty of the next one.

Upload proves a transfer

An upload result can prove that the pipeline sent a particular artifact to a provider endpoint and received a response. The record should keep the artifact digest, destination, provider reference, response class, and time.

That is already valuable. If the network fails after the request leaves, the provider reference may be the only safe lookup path. If a later operator sees a timeout, they can reconcile before uploading again. If the response confirms receipt, the pipeline can stop treating the binary as local-only.

Upload does not prove that provider-side validation passed. A store can receive a package and later reject its metadata, signing, version, entitlements, or policy checks. Calling the release accepted at upload time hides the next boundary and makes a later rejection look like a reversal of history.

Acceptance belongs to the destination

Acceptance means the destination has recognised the submitted artifact under a specific release context. The exact meaning varies by provider and track, so the timeline should preserve the provider's state without flattening every positive response into approved.

An internal-testing build can be accepted for that audience while production remains untouched. A package can finish processing but still need review. A reviewed release can still wait for a human-controlled publication step. Destination and stage belong beside the status because accepted where is part of the fact.

artifact: android-482
digest: sha256:example-b
destination: internal-testing
upload: confirmed
provider-reference: release-9182
processing: complete
availability: eligible-testers
observed-at: 2026-09-19T09:30:00Z

We also retain the observation time. Provider states can change after the pipeline stops watching. A processing result from yesterday is historical evidence, not a current claim about availability today.

Availability needs an audience

Available is incomplete without saying who can receive the release. Internal testers, a beta group, one percent of production users, and the full production audience are materially different outcomes.

The release record should name the intended audience and the observed audience. If a staged rollout is configured for ten percent, the product can say rollout configured for ten percent after the provider confirms it. It should not claim that ten percent of devices have installed the build unless install evidence actually supports that statement.

Availability is also distinct from adoption. A store listing can offer the new version while many users remain on older binaries. Release systems should resist turning eligible to update into running in production. Runtime version evidence, when available and appropriately bounded, belongs in its own layer.

Transitions should fail narrowly

When processing fails, the upload can remain successful. When review is rejected, the provider receipt can remain valid. When a staged rollout is paused, the accepted artifact does not become unaccepted. Preserving each fact gives the operator a smaller recovery job.

The interface should show the failed boundary and the last completed boundary together. Uploaded and processing failed is more useful than release failed. Accepted for internal testing and not submitted to production is more useful than pending. The next action follows from the exact gap.

Automation needs the same discipline. A retry after an uncertain upload should look up the provider reference first. A retry after a validation rejection may need a new artifact. A paused rollout may need an approval decision rather than another binary transfer. One generic retry button invites the wrong operation at least some of the time.

Make the headline match the strongest proof

Release notifications often collapse the whole sequence because teams want a short message. The short message can still be accurate. Build uploaded to internal testing. Store processing complete, awaiting review. Version available to the staged production audience. Each sentence names the strongest proved boundary.

We build Ubriot to keep mobile release work understandable across tools and long handoffs. A successful upload deserves a green result, but only for upload. Let provider acceptance earn the next state, and let observed audience availability earn the claim that a release can be received. The timeline becomes calmer when every green label stays inside the boundary it actually crossed.

Try Ubriot AI

React Native CI/CD from one CLI.

Get started