Skip to main content

Manifest Schema

The .eve/manifest.yaml file is the single source of truth for how an Eve Horizon project builds, deploys, and runs. It uses Docker Compose-style service definitions extended with Eve-specific fields under x-eve.

The current schema identifier is eve/compose/v2. Unknown fields are allowed for forward compatibility.

Minimal Example

schema: eve/compose/v2
project: my-project

registry:
host: public.ecr.aws/w7c4v0w3
namespace: eve-horizon
auth:
username_secret: REGISTRY_USERNAME
token_secret: REGISTRY_PASSWORD

services:
db:
image: postgres:16
ports: [5432]
environment:
POSTGRES_DB: app
POSTGRES_USER: app
POSTGRES_PASSWORD: ${secret.DB_PASSWORD}
healthcheck:
test: ["CMD", "pg_isready", "-U", "app"]
interval: 5s
timeout: 3s
retries: 5

api:
build:
context: ./apps/api
ports: [3000]
environment:
DATABASE_URL: postgres://app:${secret.DB_PASSWORD}@db:5432/app
depends_on:
db:
condition: service_healthy
x-eve:
ingress:
public: true
port: 3000
api_spec:
type: openapi
spec_url: /openapi.json

environments:
test:
pipeline: deploy-test

pipelines:
deploy-test:
steps:
- name: migrate
action: { type: job, service: migrate }
- name: deploy
depends_on: [migrate]
action: { type: deploy }

Top-Level Fields

FieldRequiredTypeDescription
schemaNostringSchema identifier, e.g., eve/compose/v2
projectNostringHuman-friendly project slug (informational)
registryNoobject | "eve" | "none"Container registry configuration
servicesYesmap<string, Service>Compose-style service definitions
environmentsNomap<string, Environment>Environment definitions and overrides
pipelinesNomap<string, Pipeline>Deterministic step-based pipelines
workflowsNomap<string, Workflow>On-demand workflow definitions
versioningNoobjectRelease/version policy (semver, tagging)
x-eveNoobjectEve-specific top-level extensions

Services

Services follow Docker Compose conventions. Each key under services is a service name.

Service Fields

FieldTypeDescription
imagestringBase image (tag optional -- Eve tags at build time)
buildobjectBuild configuration
build.contextstringBuild context directory (required if build is set)
build.dockerfilestringDockerfile path relative to context
build.argsmap<string, string>Build-time arguments
environmentmap<string, string>Environment variable map
portsarray<string | number>Container ports (Compose-style entries)
depends_onmap<string, object>Dependency ordering with health conditions
healthcheckobjectDocker-style health check
commandstring | arrayOverride the container command
volumesarray<string>Volume mounts (Compose syntax)
x-eveobjectEve extensions (see below)

Dependency Conditions

depends_on:
db:
condition: service_healthy

Supported values: service_started (alias: started), service_healthy (alias: healthy).

Health Checks

healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 10s
timeout: 5s
retries: 3
start_period: 10s

All timing fields are optional duration strings (e.g., 5s, 10s).


Service x-eve Extensions

Each service may include an x-eve block (or x_eve in code) for Eve-specific behavior.

FieldTypeDescription
rolestringcomponent (default), worker, job, or managed_db
ingressobjectPublic routing configuration
ingress.publicbooleanEnable public ingress (default: true when ports are exposed)
ingress.portnumberPort to route traffic to
ingress.aliasstringCustom subdomain alias (3-63 chars, lowercase alphanumeric + hyphens)
ingress.domainstringOverride domain used for ingress hostname generation
api_specobjectSingle API spec registration
api_specsarray<ApiSpec>Multiple API spec registrations
externalbooleanIf true, service is not deployed (external dependency)
urlstringConnection string for external services
worker_typestringWorker pool type for worker-role services
filesarray<FileMount>Mount repo files into the container
storageobjectPersistent volume configuration
managedobjectManaged database config (requires role: managed_db)

Roles

  • component (default) -- a long-running service deployed to Kubernetes.
  • worker -- a background worker service.
  • job -- a one-off container (migrations, seeds) runnable as a pipeline step.
  • managed_db -- a platform-provisioned database (not deployed to Kubernetes).

API Spec Registration

x-eve:
api_spec:
type: openapi # openapi | postgrest | graphql
spec_path: /app/openapi.json
# or spec_url: /openapi.json
on_deploy: true # refresh spec after each deploy (default: true)
auth: eve # eve | none (default: eve)
name: my-api # optional display name

spec_url may be relative (resolved against the service URL) or absolute. spec_path is resolved against the container filesystem.

File Mounts

x-eve:
files:
- source: ./config/app.conf # relative path in repo
target: /etc/app/app.conf # absolute path in container

Persistent Storage

x-eve:
storage:
name: app-data
mount_path: /data
size: 10Gi
access_mode: ReadWriteOnce # ReadWriteOnce | ReadWriteMany | ReadOnlyMany
storage_class: standard

Managed Databases

Services with role: managed_db are provisioned by the platform, not deployed to Kubernetes.

services:
db:
x-eve:
role: managed_db
managed:
class: db.p1 # tier: db.p1, db.p2, db.p3
engine: postgres # only postgres currently supported
engine_version: "16"
  • Provisioning happens on first deploy for an environment.
  • Use eve db status --env <name> to view provisioning state.
  • Other services reference managed values with ${managed.<service>.<field>} placeholders (resolved at deploy time).

Environments

Environments link pipelines to deploy targets and support per-environment overrides.

environments:
staging:
pipeline: deploy
pipeline_inputs:
smoke_test: true
timeout: 1800
approval: required
overrides:
services:
api:
environment:
NODE_ENV: staging
workers:
- type: default
service: worker
replicas: 2
FieldTypeDescription
pipelinestringPipeline to run when deploying this environment
pipeline_inputsmap<string, any>Default inputs for the pipeline run (merged with CLI --inputs, CLI wins)
approvalstringSet to required to gate deploy and job steps
typestringEnvironment lifecycle: persistent or temporary
kindstringEnvironment taxonomy: standard or preview
labelsarray<string>Metadata labels for filtering and UIs
overridesobjectCompose-style service overrides for this environment
overrides.servicesmap<string, Service>Per-service environment/config overrides
workersarray<object>Worker pool selection for this environment

Environment Pipeline Behavior

When pipeline is set, eve env deploy <env> triggers a pipeline run instead of a direct deployment. This enables consistent build/test/deploy workflows and promotion patterns.

To bypass the pipeline and perform a direct deployment:

eve env deploy staging --ref <sha> --direct

Promotion Pattern

environments:
test:
pipeline: deploy-test
staging:
pipeline: deploy
pipeline_inputs:
smoke_test: true
production:
pipeline: deploy
approval: required
# Build + test + release in test
eve env deploy test --ref <sha>

# Promote to staging (reuse release)
eve release resolve v1.2.3
eve env deploy staging --ref <sha> --inputs '{"release_id":"rel_xxx"}'

# Promote to production (approval gate)
eve env deploy production --ref <sha> --inputs '{"release_id":"rel_xxx"}'

Triggers

Pipelines and workflows can be triggered automatically via events from GitHub, Slack, the system, or cron schedules.

Triggers are declared under:

  • pipelines.<name>.trigger
  • workflows.<name>.trigger

GitHub push trigger

pipelines:
ci-cd-main:
trigger:
github:
event: push
branch: main

GitHub pull request trigger

pipelines:
ci-cd-main:
trigger:
github:
event: pull_request
action: [opened, synchronize, reopened]
base_branch: main

Slack trigger

workflows:
support:
trigger:
slack:
event: app_mention
channel: C123ABC

System trigger

pipelines:
remediation:
trigger:
system:
event: job.failed
pipeline: deploy

Cron and manual triggers

workflows:
log-audit:
trigger:
cron:
schedule: "0 */6 * * *"
workflows:
manual-release:
trigger:
manual: true

Use these rules on both pipelines and workflows when you want automation, remediation, or scheduled maintenance.


Pipelines

Pipelines define deterministic step graphs that expand into job graphs at runtime.

pipelines:
deploy:
steps:
- name: build
action: { type: build }
- name: unit-tests
script:
run: "pnpm test"
timeout: 1800
- name: release
depends_on: [build, unit-tests]
action: { type: release }
- name: deploy
depends_on: [release]
action: { type: deploy }

Step Types

Each step is one of the following:

TypeFieldDescription
actionaction.typeBuilt-in action: build, release, deploy, run, job, create-pr
scriptscript.runShell command executed by the worker
agentagent.promptAI agent job with an optional config block
runrunShorthand for script.run

Step Fields

FieldTypeDescription
namestringStep identifier (unique within pipeline)
depends_onarray<string>Step names that must complete before this step runs
actionobjectBuilt-in action configuration
action.typestringBuilt-in action name (build, release, deploy, run, job, create-pr, notify, env-ensure, env-delete)
action.withobjectAction-specific parameters
scriptobjectScript execution (run, command, timeout)
agentobjectAI agent job (prompt, optional config)
runstringShorthand for script.run
requiresobjectStep-level requirements
requires.secretsarray<string>Secrets required by this step (validated during sync)

Action Types

ActionDescription
buildBuild container images for services with build config
releaseCreate a tagged release from build artifacts
deployDeploy services to the target environment
runRun a one-off container
jobExecute a service marked as role: job (e.g., migrations)
create-prCreate a pull request from job changes
notifySend a notification when the step completes
env-ensureEnsure an environment exists and is ready
env-deleteDelete a managed environment and optional resources

Action input fields

ActionKeyPurpose
deployenv_nameTarget environment for the deployment
jobserviceRun a x-eve.role: job service
create-prtitle, body, branchPR metadata
notifychannel, messageNotification destination and message
env-ensureenv_name, kindCreate environment if missing (standard or preview)
env-deleteenv_nameDelete environment

Workflows

Workflows are manifest-defined jobs stored and returned as-is. The platform extracts db_access when present. Use the optional hints block to set workflow-level defaults (for example timeout, worker type, or gates).

workflows:
nightly-audit:
db_access: read_only
hints:
worker_type: default-worker
steps:
- agent:
prompt: "Audit errors and summarize anomalies"

Invoke workflows with the CLI:

eve workflow run nightly-audit --input '{"scope":"last-24h"}'
eve workflow invoke nightly-audit # run and wait for result

Registry

The registry field configures container image storage.

Object Form

registry:
host: public.ecr.aws/w7c4v0w3
namespace: eve-horizon
auth:
username_secret: REGISTRY_USERNAME
token_secret: REGISTRY_PASSWORD
FieldTypeDescription
hoststringRegistry hostname
namespacestringImage namespace/prefix
auth.username_secretstringSecret name for registry username
auth.token_secretstringSecret name for registry password/token

The deployer uses these secrets to create Kubernetes imagePullSecrets.

String Form

registry: "eve"    # Use Eve-native registry (internal, JWT-based auth)
registry: "none" # Opt out of registry auth (public images or external auth)

x-eve.defaults

Default settings for jobs created in this project. Merged on job creation; explicit job fields override defaults.

x-eve:
defaults:
env: staging
harness_preference:
harness: mclaude
profile: primary-orchestrator
options:
model: opus-4.5
reasoning_effort: high
hints:
permission_policy: auto_edit
resource_class: job.c1
max_cost:
currency: usd
amount: 5
max_tokens: 200000
git:
ref_policy: auto
branch: job/${job_id}
create_branch: if_missing
commit: manual
push: never
workspace:
mode: job
FieldTypeDescription
envstringDefault target environment for jobs
harness_preferenceobjectPreferred harness defaults; replaces legacy harness / harness_profile / harness_options
harnessstringDeprecated. Use harness_preference.harness.
harness_profilestringDeprecated. Use harness_preference.profile.
harness_optionsobjectDeprecated. Use harness_preference.options.
hintsobjectDeprecated. Legacy job-hints fields retained for compatibility.
gitobjectDefault git controls (see Job API -- Git Controls)
workspaceobjectDefault workspace configuration
Deprecation

harness, harness_profile, and harness_options are legacy fields and map to harness_preference. hints at this level is also legacy; prefer inline profile preferences or explicit agent-level hints.


x-eve.agents

Define per-project agent profiles and councils for orchestration.

x-eve:
agents:
version: 1
availability:
drop_unavailable: true
profiles:
primary-orchestrator:
- harness: mclaude
model: opus-4.5
reasoning_effort: high
primary-reviewer:
- harness: mclaude
model: opus-4.5
reasoning_effort: high
- harness: codex
model: gpt-5.2-codex
reasoning_effort: x-high
planning-council:
- profile: primary-planner
- harness: gemini
model: gemini-3

Each profile is an ordered array of harness/model candidates. The orchestrator selects the first available candidate, or runs councils in parallel.

The manifest sync API returns parsed agent config as parsed_agents, consumed by orchestrators via eve agents config.

Pack overlay removals

Use _remove: true in an override object to drop a value introduced by a pack:

agents:
stale-pack-agent:
_remove: true

This keeps a local manifest authoritative by explicitly removing inherited values instead of silently merging.


x-eve.packs

AgentPacks import agent, team, chat, and skills configuration from external repositories.

x-eve:
# Default agents to install skills for (defaults to [claude-code])
install_agents: [claude-code, codex, gemini-cli]

packs:
# Local pack
- source: ./skillpacks/my-pack

# Remote pack (ref required for remote sources)
- source: incept5/eve-skillpacks
ref: 0123456789abcdef0123456789abcdef01234567
packs: [eve-work, eve-se]

# Per-pack agent override
- source: ./skillpacks/claude-only
install_agents: [claude-code]
FieldTypeDescription
sourcestringLocal path, owner/repo, github:owner/repo, or git URL
refstring40-character SHA (required for remote sources)
packsarray<string>Optional subset of remote pack namespaces to install
install_agentsarray<string>Override which agents receive this pack's skills

Pack refs and subset filters follow the same form shown above: source identifies the pack source, ref pins the version, and optional packs limits which named pack groups are installed.

Packs are resolved by eve agents sync and locked in .eve/packs.lock.yaml. Use eve packs status to check lockfile state and drift.


x-eve.requires

Declare required secrets for validation during manifest sync.

x-eve:
requires:
secrets: [GITHUB_TOKEN, REGISTRY_TOKEN]

Pipeline steps can also declare per-step secret requirements:

pipelines:
ci:
steps:
- name: integration-tests
script:
run: "pnpm test"
requires:
secrets: [DATABASE_URL]

Validate with:

eve project sync --validate-secrets     # validate during sync
eve project sync --strict # fail on missing secrets
eve manifest validate # pre-flight check without syncing

Platform-Injected Environment Variables

Eve automatically injects these variables into all deployed services:

VariableDescription
EVE_API_URLInternal cluster URL for server-to-server calls (e.g., http://eve-api:4701)
EVE_PUBLIC_API_URLPublic ingress URL for browser-facing apps (e.g., https://api.eh1.incept5.dev)
EVE_PROJECT_IDThe project ID (e.g., proj_01abc123...)
EVE_ORG_IDThe organization ID (e.g., org_01xyz789...)
EVE_ENV_NAMEThe environment name (e.g., staging, production)

Use EVE_API_URL for backend/server-side calls within the cluster. Use EVE_PUBLIC_API_URL for browser or external calls.

Job runners additionally receive EVE_ENV_NAMESPACE, EVE_JOB_ID, EVE_ATTEMPT_ID, EVE_AGENT_ID, and EVE_PARENT_JOB_ID.

Services can override any of these by defining them explicitly in their environment section.


Secret Interpolation

Reference secrets in environment values with the ${secret.<KEY>} syntax:

environment:
DATABASE_URL: postgres://app:${secret.DB_PASSWORD}@db:5432/app
API_KEY: ${secret.THIRD_PARTY_API_KEY}

Secrets are resolved at deploy time from the project's secret store. They are never written to the manifest or exposed in logs.


Variable Interpolation

Environment values support variable interpolation for deploy-time context:

VariableDescription
${ENV_NAME}Current environment name
${PROJECT_ID}Project ID
${ORG_ID}Organization ID
${COMPONENT_NAME}Service/component name
${ORG_SLUG}Organization slug

Example:

environment:
POSTGRES_DB: app_${ENV_NAME}
LOG_PREFIX: ${PROJECT_ID}/${ENV_NAME}

Managed Database Placeholders

When a service depends on a managed database, reference provisioned values with ${managed.<service>.<field>}:

environment:
DATABASE_URL: ${managed.db.url}

These placeholders are resolved at deploy time once the managed database is provisioned.


See Also

  • CLI Commands -- eve project sync, eve manifest validate
  • Job API -- how x-eve.defaults merges into job creation
  • Pipelines -- pipeline execution details
  • Workflows -- workflow invocation patterns