Configuration

Schema

Every field of ship.yml, generated from the same definition the platform validates against.

ship.yml lives at the root of your repository and configures everything a mission does in it: where a preview deploys, which harness and model each agent runs on, and how long the retry loop keeps going.

This page is the complete field list, generated from the same schema the platform validates your file with, so it describes exactly what will be accepted.

Editor support

The schema is published as JSON Schema. Point your editor at it and you get completion and inline validation as you type:

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

It is served unauthenticated at https://letsship.ai/schema/ship.yml.json so editors and CI in any repository can fetch it.

Worth wiring up even if you only edit the file occasionally: every block lives in one document, so a file that fails validation takes the rest of its configuration down with it, so agents and retries revert to platform defaults without a second complaint.

Top level

FieldTypeRequiredDescription
version1yesManifest format version. Always 1.
baseBranchstringnoThe branch agents fork from and target their pull request at. Defaults to main. Set it to work off develop or a release branch.
deploymentsobjectyesPreview environments, keyed by name. The pipeline reads the preview key; the block is required, so write it empty when there is nothing to deploy.
agentsobjectnoPer-role harness, model and prompt configuration. An omitted role takes the platform defaults.
retriesobjectnoHow long the build → CI → review → QA loop keeps going before the mission is handed back to a human.
qaSurfaceobjectnoHow QA exercises the change when there is no deployed preview URL. Detected from your project by default.

deployments.<environment>

FieldTypeRequiredDescription
type"cloudflare-worker"yesThe deploy target's kind.
workflowstringyesThe workflow file SHIP dispatches. It must exist on your default branch for GitHub to accept the dispatch; the version that runs is the one on the pull request's branch.
configFilestringyesRepo-relative path to the deploy tool's configuration, passed through to your workflow.
envNamestringyesThe environment name within that configuration.
appNamestringyesBase name for the per-PR application. The deployed name is {appName}-pr{N}-{issueId}, stable across pushes.
accountSubdomainstringyesYour *.workers.dev subdomain, used to build the preview URL.
previewHoststringnoHostname template for the preview, with {pr} replaced by the pull request number. Omit to stay on *.workers.dev. Required for anything depending on zone-level features such as image transformations.
skipDeployPathsstring[]noGlobs marking a change as non-deployable for this target. Setting this REPLACES the built-in list. The deploy is skipped only when every changed file matches.
servicesobject[]noThe previewable services in this environment. Omit it for a single deployable application, in which case the fields above are treated as one implicit service.
datastoresobject[]noDatastores provisioned for this environment. Omit to provision none.

services[]

FieldTypeRequiredDescription
namestringyesUnique name for this service, referenced by bindings.
kindstringyesThe service's kind, e.g. cloudflare-worker.
configFilestringyesRepo-relative path to this service's deploy configuration.
appNamestringyesBase name for this service's per-PR application.
envNamestringnoEnvironment name within this service's configuration.
previewHoststringnoPreview hostname template for this service specifically.
buildstringnoBuild command to run before deploying this service.
pathsstring[]yesGlobs whose change affects this service. A pull request touching none of them does not redeploy it.
bindingsobject[]noHow this service reaches its peers in the same environment.
datastoresstring[]noNames of datastores entries this service binds. A datastore is provisioned only when a service that binds it is part of the deploy.

services[].bindings[]

FieldTypeRequiredDescription
namestringyesThe binding name the deployed code reaches the peer by.
servicestringyesThe name of another service in this same list.
baselinestringyesWhat the binding resolves to when that service is not part of this deploy: the standing target that keeps a partial deploy coherent.

datastores[]

FieldTypeRequiredDescription
namestringyesUnique name for this datastore, referenced by services.
kindstringyesThe datastore's kind, e.g. cloudflare-d1.
bindingstringyesThe binding name deployed code reaches this datastore by.
migrationsobjectyesWhere this datastore's migration set is read from.
seedobjectnoHow the datastore is populated after migrations. Omit to leave it empty.

datastores[].migrations

FieldTypeRequiredDescription
sourcestringyesRepo-relative directory of migration files, applied in ascending order of their numeric filename prefix.

datastores[].seed

FieldTypeRequiredDescription
from"fixtures", "environment"yesfixtures reads a committed file; environment reads from a named live environment.
pathstringnoThe committed fixture file. Required with from: fixtures.
environmentstringnoThe live environment to read from. Required with from: environment, and refused when it names production.
allowLiveSeedbooleannoMust be explicitly true to seed from a live environment at all. Never seed a preview from production data.

agents.<role>

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

FieldTypeRequiredDescription
harness"claude-code", "codex", "pi", "kilo-code", "open-code"noThe coding harness this role runs on.
modelstringnoAn alias (opus, sonnet, haiku, codex) or a concrete versioned model id, passed through unchanged.
providerstringnoGateway provider id for the open-model harnesses. Defaults to the harness's own.
effortstringnoReasoning-effort knob, mapped to each harness's native control. Harnesses without one ignore it.
providerRoutingobjectnoUpstream-provider pin for gateway-routed harnesses, for deterministic runs.
checkpointbooleannoPause the pipeline after this role's stage so a human can review the handoff. QA is the terminal stage and cannot be checkpointed.
rejectOn"critical", "suggestion", "trivial"noReview rejection threshold, meaningful on reviewer only. critical is the default; trivial blocks on everything.
promptstringnoRepo-relative path to an extra prompt file for this role, appended to SHIP's own charter and never replacing it. Wins over the default .ship/agents/<role>.md location. Up to 512 characters.

providerRouting

FieldTypeRequiredDescription
orderstring[]noUpstream providers to try, in order.
onlystring[]noRestrict routing to these upstream providers.
ignorestring[]noNever route to these upstream providers.
allowFallbacksbooleannoWhether another provider may serve the request.
requireParametersbooleannoOnly route to providers supporting every requested parameter.
quantizationsstring[]noAcceptable model quantizations.
sortstringnoHow to rank eligible providers.
dataCollection"allow", "deny"noWhether providers that retain data are eligible.

retries

FieldTypeRequiredDescription
maxRetriesintegernoOuter attempt ceiling. Default 25. 1-200.
reviewOscillationLimitintegernoReview rounds requesting changes the same way before escalating. Default 2. 1-50.
qaOscillationLimitintegernoQA rounds failing the same way before escalating. Default 2. 1-50.
ciOscillationLimitintegernoConsecutive identical CI failures before escalating. Default 2. 1-50.
maxReviewGrantsintegernoExtra review rounds the progress brake may grant past the review limit. Default 3. 0-50.
reviewProgressRetryIncrementintegernoAttempts added to the ceiling per granted extension. Default 5. 0-25.
reviewProgressMaxRetriesCapintegernoAbsolute ceiling those grants can ever reach. Default 40. 1-200.

qaSurface

FieldTypeRequiredDescription
surface"auto", "web", "browser-extension", "api", "none"noWhich surface QA exercises. auto detects it from your project.
buildstringnoBuild command, overriding the detected one.
servestringnoLocal serve command, overriding the detected one. It must bind servePort.
servePortintegernoThe port the served app listens on. Cannot be 3000, which the sandbox reserves for itself. 1024-65535.
distPathstringnoThe unpacked extension directory, for browser-extension.
entrystring[]noEntry pages to exercise, for browser-extension.
specPathstringnoRepo-relative path to an OpenAPI document, for api. Detected when omitted.

How is this page?

On this page