Configuration

Schema

This page lists every field of ship.yml, from the same definition that SHIP validates the file against.

ship.yml is at the root of your repository. It configures everything that a mission does in that repository. This includes where a preview deploys, which harness and model each agent runs on, and how long the retry loop continues.

This page lists every field. It comes from the same schema that SHIP uses to validate your file, so it describes exactly what SHIP accepts.

Editor support

SHIP publishes the schema as JSON Schema. Point your editor at it to get completion and inline validation while you type:

# yaml-language-server: $schema=https://letsship.ai/schema/ship.yml.json
version: 1

The schema is at https://letsship.ai/schema/ship.yml.json. It needs no authentication, so editors and CI in any repository can fetch it.

Configure your editor for the schema even if you edit the file only sometimes. All blocks are in one document, so a file that fails validation loses all of its configuration. Then agents and retries return to the platform defaults, and no second error tells you.

Top level

FieldTypeRequiredDescription
version1yesThe manifest format version. It is always 1.
baseBranchstringnoThe branch that agents start from and open their pull request against. The default is main. Set it to develop or a release branch to work from that branch.
deploymentsobjectyesThe preview environments, keyed by name. The pipeline reads the preview key. The block is required, so if there is nothing to deploy, write an empty block.
agentsobjectnoThe harness, model and prompt for each role. A role that you omit uses the platform defaults.
mcpobjectnoThe location of your MCP server file. See MCP servers.
retriesobjectnoHow long the build → CI → review → QA loop continues before SHIP hands the mission back to a person.
qaSurfaceobjectnoHow QA tests the change when there is no deployed preview URL. By default, SHIP detects it from your project.
qaobjectnoHow QA signs in to your preview to verify pages that need a sign-in. See QA sign-in.

deployments.<environment>

FieldTypeRequiredDescription
type"cloudflare-worker"yesThe kind of deploy target.
workflowstringyesThe workflow file that SHIP dispatches. It must exist on your default branch, or GitHub does not accept the dispatch. The version that runs is the one on the pull request's branch.
configFilestringyesThe repository-relative path to the configuration of your deploy tool. SHIP passes it to your workflow.
envNamestringyesThe environment name in that configuration.
appNamestringyesThe base name for the application that SHIP deploys for each pull request. The deployed name is {appName}-pr{N}-{issueId}, and it stays the same across pushes.
accountSubdomainstringyesYour *.workers.dev subdomain. SHIP uses it to build the preview URL.
previewHoststringnoThe hostname template for the preview. SHIP replaces {pr} with the pull request number. If you omit it, the preview stays on *.workers.dev. It is required for anything that needs zone-level features, such as image transformations.
skipDeployPathsstring[]noGlobs that mark a change as not deployable for this target. A value here REPLACES the built-in list. SHIP skips the deploy only when every changed file matches.
servicesobject[]noThe services in this environment that can have a preview. For a single deployable application, omit it. Then SHIP treats the fields above as one implicit service.
datastoresobject[]noThe datastores that SHIP provisions for this environment. If you omit it, SHIP provisions none.

services[]

FieldTypeRequiredDescription
namestringyesA unique name for this service. Bindings refer to the service by this name.
kindstringyesThe kind of service, for example cloudflare-worker.
configFilestringyesThe repository-relative path to the deploy configuration of this service.
appNamestringyesThe base name for the application that SHIP deploys for this service on each pull request.
envNamestringnoThe environment name in the configuration of this service.
previewHoststringnoThe preview hostname template for this service only.
buildstringnoThe build command to run before SHIP deploys this service.
pathsstring[]yesGlobs for the files that affect this service. If a pull request changes none of them, SHIP does not redeploy the service.
bindingsobject[]noHow this service connects to the other services in the same environment.
datastoresstring[]noThe names of the datastores entries that this service binds. SHIP provisions a datastore only when a service that binds it is part of the deploy.

services[].bindings[]

FieldTypeRequiredDescription
namestringyesThe name that the deployed code uses to reach the other service.
servicestringyesThe name of another service in this same list.
baselinestringyesWhat the binding resolves to when that service is not part of this deploy. This fixed target keeps a partial deploy consistent.

datastores[]

FieldTypeRequiredDescription
namestringyesA unique name for this datastore. Services refer to the datastore by this name.
kindstringyesThe kind of datastore, for example cloudflare-d1.
bindingstringyesThe name that the deployed code uses to reach this datastore.
migrationsobjectyesThe location of the migrations for this datastore.
seedobjectnoHow SHIP fills the datastore after the migrations. If you omit it, the datastore stays empty.

datastores[].migrations

FieldTypeRequiredDescription
sourcestringyesThe repository-relative directory of migration files. SHIP applies them in ascending order of the number at the start of each filename.

datastores[].seed

FieldTypeRequiredDescription
from"fixtures", "environment"yesfixtures reads a committed file. environment reads from a named live environment.
pathstringnoThe committed fixture file. It is required with from: fixtures.
environmentstringnoThe live environment to read from. It is required with from: environment. SHIP refuses a value that names production.
allowLiveSeedbooleannoSHIP seeds from a live environment only when this is true. Never seed a preview from production data.

agents.<role>

Accepted keys: planner, builder, reviewer, qa. Each key takes the same fields.

FieldTypeRequiredDescription
harness"claude-code", "codex", "pi", "kilo-code", "open-code"noThe coding harness that this role runs on.
modelstringnoAn alias (opus, sonnet, haiku, codex, gpt) or a versioned model id. An alias always resolves to the newest model of its family. SHIP passes a model id through unchanged. The default is opus on claude-code.
providerstringnoThe gateway provider id for the open-model harnesses. The default is the harness's own provider.
effortstringnoThe reasoning effort, which SHIP maps to the native control of each harness. On claude-code, it must be low, medium, high, xhigh or max, or the stage fails before it starts. A harness without an effort control ignores it.
providerRoutingobjectnoAn upstream provider pin for harnesses that route through a gateway. Use it for deterministic runs.
checkpointbooleannoPause the pipeline after the stage of this role, so that a person can review the handoff. QA is the last stage, and you cannot set a checkpoint on it.
rejectOn"critical", "suggestion", "trivial"noThe review rejection threshold. It applies to reviewer only. critical is the default. trivial blocks on findings of every severity.
promptstringnoThe repository-relative path to an extra prompt file for this role. SHIP appends it to its own charter and never replaces the charter. It takes priority over the default .ship/agents/<role>.md location. Up to 512 characters.
sandboxstringnoThe name or id of the sandbox (from the console) that the agent of this role starts in. It takes priority over the repository's .ship/sandbox.Dockerfile and the project's default sandbox. Up to 200 characters.
sizeunknownnoThe container size for this role: standard-1 to standard-4, or { vcpu, memoryMib, diskMb }. It takes priority over the default size of the sandbox.
mcpunknown[]noA filter on the MCP servers that this role receives. The servers and their credentials come from the MCP bindings of the project. List server names, or use { server, tools } to also limit the tools. It can only remove access that a binding grants, and it can never add access. Up to 32 entries.

providerRouting

FieldTypeRequiredDescription
orderstring[]noThe upstream providers to try, in order.
onlystring[]noRoute only to these upstream providers.
ignorestring[]noNever route to these upstream providers.
allowFallbacksbooleannoWhether another provider may serve the request.
requireParametersbooleannoRoute only to providers that support every requested parameter.
quantizationsstring[]noThe model quantizations that you accept.
sortstringnoHow to rank eligible providers.
dataCollection"allow", "deny"noWhether providers that retain data are eligible.

mcp

FieldTypeRequiredDescription
configstringyesThe repository-relative path of the file that declares your MCP servers, such as .cursor/mcp.json. It takes priority over the path set on the project in SHIP. If neither is set, SHIP reads .mcp.json. SHIP reads this field from your base branch, so a pull request cannot change its own. Up to 256 characters.

retries

FieldTypeRequiredDescription
maxRetriesintegernoThe outer attempt limit. The default is 25. 1-200.
reviewOscillationLimitintegernoThe number of review rounds that request changes in the same way before SHIP escalates. The default is 2. 1-50.
qaOscillationLimitintegernoThe number of QA rounds that fail in the same way before SHIP escalates. The default is 2. 1-50.
ciOscillationLimitintegernoThe number of identical CI failures in a row before SHIP escalates. The default is 2. 1-50.
maxReviewGrantsintegernoThe number of extra review rounds that the progress brake can grant after the review limit. The default is 3. 0-50.
reviewProgressRetryIncrementintegernoThe number of attempts that each granted extension adds to the attempt limit. The default is 5. 0-25.
reviewProgressMaxRetriesCapintegernoThe highest attempt limit that the grants can ever reach. The default is 40. 1-200.

qaSurface

FieldTypeRequiredDescription
surface"auto", "web", "browser-extension", "api", "none"noThe surface that QA tests. auto detects it from your project.
buildstringnoA build command that overrides the detected one.
servestringnoA local serve command that overrides the detected one. It must bind servePort.
servePortintegernoThe port that the served app listens on. It cannot be 3000, because the sandbox reserves that port. 1024-65535.
distPathstringnoThe unpacked extension directory, for browser-extension.
entrystring[]noThe entry pages to test, for browser-extension.
specPathstringnoThe repository-relative path to an OpenAPI document, for api. If you omit it, SHIP detects the document.

qa

FieldTypeRequiredDescription
signInobjectnoA sign-in that needs no secret, which QA follows on the preview. SHIP reads it from your base branch, so a pull request cannot change its own. Without it, criteria that need a sign-in fail as unverifiable.

signIn

FieldTypeRequiredDescription
pathstringyesThe sign-in page, relative to the preview origin, such as /login. It must start with one / and contain no backslashes or spaces. Up to 200 characters.
stepsstringyesWhat to do on that page, in plain words. QA follows the steps with ordinary browser actions. The steps are committed and shown to the agent, so never put a password or token in them. Up to 2000 characters.

How is this page?

On this page