Status: partly built (STA-72). The runway check in
pnpm validate, core’s runway.yaml, the
cloudflare-workers, npm and mintlify provider workflows, the supply-chain checks and pnpm runway are written; none has run yet (testing pass STA-597). The secrets and vars sync is
designed here and not built (STA-606). Everything that needs the generated Encore app waits for
gen: the Encore deploy spike (STA-136), the staging deploy, images and generated CI pipelines.Runway files
pnpm validate reads every one of them, checks it against the version 3 schema of its kind with @stackra/runway, and checks that a grouped topology places each service member exactly once (checkRunwayFiles). A runway.yaml anywhere else is a finding. The check uses the built package: the Quality Gate builds before it validates, and a local pnpm validate before a build prints a notice instead.
Core’s root runway declares only dev and production: Stackra deploys only its own infrastructure, the static Worker, the docs and the npm packages (0170 decision 1). The docs member has its runway (0299 decision 6); workers/static gets one with gen, when its hand-written wrangler.jsonc goes (0284 decision 8).
Provider workflows
Each provider is aworkflow_call workflow in .github/workflows/. Its job takes its GitHub environment from an input, so the environment’s protection, its OIDC subject and GitHub’s deployment record apply to every deploy. Each job reads one credential per step from Infisical /ci over GitHub OIDC, and without an identity id it builds, checks, prints a notice and deploys nothing.
npm checks the calling workflow, not the reusable one, so each package’s trusted publisher names
release.yml.
Calling a provider from another repository
A release of the providers is the tagrunway-v<n> on a commit of main. Pin the commit, with the tag in a comment, as for every action (0019 D1):
uses: that is not a full SHA.
The deploy command
pnpm runway is the one way to start a deploy, for people and CI alike (STA-268). It never builds or deploys on your machine: it checks the commit and dispatches the same caller workflow a merge runs.
plan [env]prints, as JSON, each target in build order with its caller workflows, the CI secret names the jobs read and the member secret and var names a deploy syncs. Names only.deploy <target>needs a clean checkout at the head oforigin/main; it prints that SHA and dispatches each caller workflow of the target.promote <sha>needs a commit onorigin/main; it dispatches every production caller that takes ashainput. That is also the rollback: promote the last good release’s SHA. A caller that only builds the head of main (Mintlify) is listed as skipped.--dry-runprints theghcommands instead of running them. An agent’sdeployorpromotewithout it asks the owner (the guard’srunway-deployrule).
Secrets and vars sync
The sync is designed here and built in STA-606, once its targets exist.-
Source. Infisical holds every value (0173). Member runways name secrets; the root names the Infisical environment per runway environment (
providers.infisical.environments) and the path (secrets.defaultPathinproviders.infisical.paths). CI-only names are rootsecrets.ciand never reach a runtime. - Who reads. The deploy job of each environment logs in with that environment’s own Infisical identity over OIDC, trusted only for that environment’s subject, so a staging job cannot read production.
-
Plan first. Before writing, the job prints the names it will write and where (
pnpm runway plan <env>shows the same list). A name the member declares and Infisical lacks fails the deploy before anything changes. -
Write from stdin only. A value never appears in argv, a file,
GITHUB_ENV, an output, an artifact or a log: -
Vars. A member’s per-environment
varsare public values. Aref:<path>value resolves from the stacks repository’s Pulumi config at deploy time (0171); a${pr}value from the build environment. - Drift. A name in the runtime that no runway declares is reported, never deleted, until a prune rule is decided.
What is not built yet
Owner steps
Agents cannot do these (STA-605):- Restrict the
staticenvironment tomainandschemas@*tags. - Create the
docsenvironment (main only), and add Infisical OIDC trusts for thedocsandreleaseenvironments. - Put
MINTLIFY_ADMIN_KEYinto Infisical/cithrough the secrets inbox, set the repository variableMINTLIFY_PROJECT_ID, and switch off the Mintlify GitHub-app deploy after the first CI deploy. - Apply
.github/rulesets/release-tags.jsonto therelease-tagsruleset. - After the merge, tag
runway-v1on the merge commit. - The first npm publish (OP2): a 7-day publish-only token as
NPM_BOOTSTRAP_TOKENin/ci, dispatchrelease.ymlwithbootstrap, add a trusted publisher namingrelease.ymlfor each package, revoke the token.