Context
Runway had the cloud and region dimensions (wave 10) but no deploy path: no provider, no promotion and no rollback, so nothing reached Encore Cloud or EAS fromrunway.yaml. The GCP foundation read which environment runs in which project
from providers.gcp.environments, a stop-gap until the schema named the cloud of an environment. Juristra needs a
dedicated profile: one tenant, its own project, the same release train (R3-SO-13, JUR-1). The runway schema existed
twice, in tools/schemas and in the package, with no recorded owner.
Decision
- The provider port.
RunwayProvider(@stackra/runway) has plan, apply, verify and rollback, pluscurrent(what a target runs now), which promotion needs. A plan is data; apply and rollback change a deployment; verify and current only read. Drivers live in@stackra/runway/nodeand run the destination’s own CLI without a shell. - Encore Cloud.
EncoreCloudProviderDriverpushes the release commit to the environment’s branch onencore://<app>; rollback force-pushes the earlier commit; verify reads the branch. The branch is runway data (environments.<env>.encore.branch, per regionencore.regions.<region>.branch, or a dedicated deployment’s own). - EAS.
EasProviderDriverstartseas buildof the environment’s profile, or publisheseas updateto its channel whentargets.eas.releaseisupdate; verify reads the build status or the update group; rollback republishes an earlier group. A store build cannot be rolled back and the driver refuses it. - Targets, promotion and rollback.
deployTargetslists every place a release lands: each kind in build order, each region in release order, then each dedicated tenant’s services.deployapplies and verifies in that order and stops at the first target that is down.promoteships what the source runs to an environment withdeploy.on: promote.rollbackreturns each target to its record of an earlier release, which the caller reads from the release records (0352 decision 7). cloudper environment.environments.<env>.cloud: { name, account }names the cloud of the environment’s foundation and the key ofproviders.aws.accountsorproviders.gcp.projectsthat holds it. It replacesproviders.gcp.environments. A KSA in-country environment iscloud: { name: gcp, account: ksa }with aksaregion onme-central2;@stackra/infra-gcpdeploys into the region’s location.- Dedicated deployments.
environments.<env>.dedicated.<key>: { tenant, cloud, regions?, encore? }deploys the environment’s services for one tenant in its own account or project whenever the environment is released. Web, mobile, desktop and docs stay one per environment. - Schema source of truth.
tools/schemas/runway-<kind>.schema.jsonstays canonical (the static Worker serves it);packages/developer/runway/schema/<kind>.jsonis its byte copy. Both are updated in the same change. - Deferred. Helm and Zarf output for on-prem waits for the first prospect.
Consequences
- A deploy, promotion or rollback is one call over one file, testable with fake command runners.
- Encore Cloud must track branches per environment and region; the owner creates those environments.
checkRegionsreports acloudwhose provider section is missing or does not hold the account.- Existing runways that used
providers.gcp.environmentsmove toenvironments.<env>.cloud.
Enforcement
packages/developer/runway/src/core/functions/__tests__/{deploy-targets,deploy,promote,rollback}.function.test.ts;
packages/developer/runway/src/node/drivers/__tests__/{encore-cloud,eas}-provider.driver.test.ts;
packages/developer/runway/src/core/functions/__tests__/runway-json-schema.function.test.ts (zod against the shipped
schema). Planned — pnpm validate comparing the two schema copies; the stackra runway commands (STA-607).
Supersedes and sources
Supersedes: none. Sources: STA-790, STA-730, STA-136, STA-607; R3-SO-13, RV-39, RV-40,JUR-1;
notes/handover/stackra-package-needs.md (@stackra/runway rows); notes/handover/build-wave10-2026-10-25.md.