Deploying a recipe
A recipe is behavior in Git; a runtime is that behavior made deployable. Deploying is the bridge between them. You declare a manifest in the repository, connect the repository through your organization’s GitHub integration, and Introspection pins the exact commit and builds a runtime version from it.
The manifest
The .introspection/<name>.yaml file is the repository-level declaration that connects a recipe package to its runtime defaults. Its filename is the stable runtime-group slug, so later commits become new versions of the same logical agent rather than unrelated runtimes.
name: support-agent
description: Triage support requests, draft grounded replies, and escalate sensitive cases.
path: .
runtime:
llm_mode: managedThe manifest declares:
| Key | What it declares |
|---|---|
name | The runtime-group name. Must equal the filename stem — support-agent here matches support-agent.yaml. |
slug | URL-safe group id; defaults to name. |
runtime_name | Optional display name for the runtime. |
path | Sub-path to the recipe package within the repository. Defaults to . (the repo root). |
description | A short summary of what the recipe does. Omitting it is a warning, not an error. |
includes | Extra file globs to pull into the recipe workspace. |
runtime.llm_mode | How the runtime gets LLM credentials: managed (default, platform-supplied) or byok (your own, via bindings). |
runtime.resources | Sandbox sizing as Kubernetes requests/limits (cpu, memory, storage). Advisory upward request — the platform clamps to its deployment minimum. |
strict | When true, unknown manifest keys are errors instead of warnings. Defaults to false. |
The filename stem and name must match. support-agent.yaml with name: support
fails validation with a filename-mismatch error. Rename the file or the field so
they agree — the name is the group’s stable identity across every future version.
Validate the manifest, package metadata, and every declared agent, skill, and glob offline before you deploy:
introspection recipes validate
introspection recipes validate --path .introspection/support-agent.yamlValidation exits 0 on success; errors exit 1, and warnings alone do not fail it.
Your repository must be under the organization’s GitHub integration
Deployment is Git-native: Introspection pins commits from a repository it can read through your organization’s GitHub integration. A repository that isn’t connected to that integration cannot be pinned. runtimes create fails with Active GitHub integration not found, and a repository row with no integration reports Recipe repository has no GitHub integration. A personal fork that the integration doesn’t cover produces the same failure — connect the repository through the org integration first.
Bootstrapping a runtime also needs a clean checkout of pushed main. Confirm it before you start:
git status --short
git rev-parse HEAD origin/mainHEAD must equal origin/main and the working tree must be clean; otherwise the pin would reference a commit the integration can’t see.
From manifest to runtime
With the repository connected and the checkout clean, create the runtime from the manifest:
introspection runtimes create --manifest .introspection/support-agent.yamlThis validates the workspace, creates the immutable recipe pin (repository, Git ref, commit SHA, and the manifest’s sub-path), and bootstraps the first runtime version in a new runtime group. The response carries the new version’s id, runtime_group_id, and recipe_id.
Bootstrap immediately activates that first version for both production and staging. Treat runtimes create as a production deployment, not a staging-only preparation step. Verify the returned runtime’s environments before sending traffic. Later pull-request versions do not move production; production changes when the integrated repository processes main.
The runtime image builds asynchronously. You can watch image_status move pending → ready with introspection runtimes get <runtime-id>, but you do not need to wait for ready to start a task — the sandbox builds on demand, so a pending version can still serve. A failed status means the build errored and the response explains why.
Versions and environments
Every commit the integration processes becomes a new immutable version in the same runtime group — the manifest filename is what keeps them in one lineage. Which version serves a request is decided by the environment lane it lands in:
stagingtracks a branch or PR ref, so it advances as new versions arrive. Pin it to freeze one exact version for a controlled test (introspection runtimes staging track/staging pin).productionis moved by a merge tomain: the integration creates the immutable version and activates it for production. There is no CLIpromote— shipping is the merge, which keeps “what’s live” auditable.developmentis the local iteration lane used byintrospection dev.
A task selects its lane with --environment on the CLI, or through the environment its API key is scoped to in the SDK; the active version for that lane answers. Normal end-user work targets production; staging and development drive the pre-production lanes.
Managed vs bring-your-own
By default (llm_mode: managed) the platform supplies model credentials, so a recipe with no external dependencies deploys with nothing else to configure. Set llm_mode: byok to bring your own provider key, supplied out of band as a credential referenced from an endpoint header — the value is applied at the egress boundary and never reaches the sandbox. Any external endpoints, variables, and MCP servers the recipe declares are connected the same way, per environment. See Bindings and LLM providers.
Related
- Recipes: the immutable, Git-backed behavior a manifest points at.
- Runtimes: runtime groups, versions, and lane routing.
- Environments: the
development/staging/productionlanes. - Connecting an agent: the end-to-end walkthrough that uses these steps.
- CLI → Runtimes: the manifest-driven runtime commands.