exoDocs

How work ships

How work ships

The one promotion path every Exo-managed App uses — canary branch → Staging → Release Candidate → Production.

This section summarizes the canonical operating guide, How Exo builds and ships. That guide stays authoritative, and specialist contracts must not describe a different path.

prompt → validated prompt-linked commit → Staging → Release Candidate → Production (Stable)
             remote canary └→ optional PR Preview ┘

The path in one minute

StagePlain-language meaningGit sourceWho moves it forwardRequired evidence
PlanDecide what outcome matters and who owns the next action.Exo portfolio itemProduct owner or operatorScope, owner, priority, and acceptance criteria
BuildMake one coherent change without disturbing shared environments.Short-lived remote canary branch from stagingDeveloper or agentPushed prompt-linked commit and relevant checks
StagingShow the integrated change in a private, realistic environment.stagingAutomatic after validationDeployed commit, passing gate, health, access, and browser review
Release CandidateFreeze the exact version proposed for release.releaseOwner explicitly directs candidate creationReviewed staging evidence, manifest, migration and rollback readiness
ProductionPut the approved candidate in front of its intended audience.main, channel stableOwner explicitly approves the releaseIdentical artifact, approval record, health, and live behavior

Preview is optional and temporary. It never replaces Staging or shortens the release path. A local checkout is an implementation tool, never a review surface.

Every target, one path

Every environment has one purpose, one artifact, and an unmistakable human approval boundary. Responsive websites, PWAs, and iPhone apps share one versioned delivery manifest, release identity, approval model, and evidence contract, while keeping platform-specific configuration (cross-platform delivery).

  • Web runs this path on Railway. The Staging → Release Candidate → Production path is live for web.
  • Mobile apps follow the same path through exo-deploy on Expo, from TestFlight to the app stores (Deploy). exo-deploy is accepted (ADR 0007) and planned.
  • Delivery targets are typed. Shared release identity and evidence live at the Exo layer, and provider specifics stay inside target adapters.
  • Drift never rewrites the contract. Provider observations report whether the live target agrees with the declared manifest (environment lifecycle).

Contributor loop

  1. Start from the latest staging, confirm entire status, and create a short-lived remote canary branch.
  2. Make one coherent, prompt-linked change, and push checkpoints promptly.
  3. Run pnpm check while working: TypeScript, lint with the UI-system gates, and repository-safe integration tests.
  4. Run pnpm verify before integration: it repeats the checks and creates the production build.
  5. Open a change review, keep the Entire session context, and integrate into staging. Ordinary staging integration needs no owner approval.
  6. Verify the staging deployment: exact commit, deployment result, /api/health, private access boundary, environment label, and browser behavior.

Release loop

  1. The owner reviews the staging outcome and explicitly directs creation of the Release Candidate.
  2. Freeze the reviewed commit on release and promote the identical artifact.
  3. Verify migrations, rollback, release notes, health, authorization, and user-visible behavior.
  4. Present the approval packet.
  5. Only explicit approval of the release → main release authorizes Production.
  6. Verify the deployed commit or checksum, health, and live behavior before marking the release complete.

Commands by intent

IntentCommandChanges external state?
Run the app locallypnpm devNo provider change
Check an implementationpnpm checkNo
Verify an integration candidatepnpm verifyNo
Inspect credential and spend readinesspnpm delivery:gateRead-only evidence only
Inspect provider resources and healthpnpm services:statusRead-only evidence only
Prepare a service changepnpm services:plan-addCreates a non-mutating local plan
Apply an approved service planpnpm services:apply-addYes; exact approval and execution gate required

In this section

Source: content/docs/shipping/index.mdx

On this page